几道这样的题,分别输出什么结果?并且说明理由,为什么会是这样的结果,全面深入的剖析
1.
- C# code
public class A { public void F() { Console.WriteLine("A.F"); Console.ReadLine(); } public virtual void G() { Console.WriteLine("A.G"); Console.ReadLine(); } } public class B : A { new public void F() { Console.WriteLine("B.F"); Console.ReadLine(); } public override void G() { Console.WriteLine("B.G"); Console.ReadLine(); } } static void Main(string[] args) { B b = new B(); A a = b; a.F(); b.F(); a.G(); b.G();}
第二题:
- C# code
public class A { public virtual void F() { Console.WriteLine("A.F"); Console.ReadLine(); } } public class B : A { public override void F() { Console.WriteLine("B.F"); Console.ReadLine(); } } public class C : B { new public virtual void F() { Console.WriteLine("C.F"); Console.ReadLine(); } } public class D : C { public override void F() { Console.WriteLine("D.F"); Console.ReadLine(); } }static void Main(string[] args) { D d = new D(); A a = d; B b = d; C c = d; a.F(); b.F(); c.F(); d.F();}
还有一些更复杂的,涉及到接口的了,把一个对象强转为接口类行等等,郁闷了
------解决方案--------------------------------------------------------
- C# code
static void Main(string[] args) { B b = new B(); A a = b; a.F(); b.F(); a.G(); b.G();}
------解决方案--------------------------------------------------------
- C# code
new 是表示实例化一个对象,而且内存会分配内存给对象其他的东西都是引用该内存对象
------解决方案--------------------------------------------------------
1.方法定义了virtual,用的时候和正常方法一样,子类继承,没有重写的话,也和平常方法一样
2.子类继承重写之后,如果没用调用base.XXX()就完全按重写后内容
3.子类重写并且调用了base.XXX()就会在相应地方掉父类方法
------解决方案--------------------------------------------------------