C#中如何调用派生类方法而非基类方法?
如何让子类实例通过父类数组调用自身的方法?
嗨,这个问题其实是C#里多态实现的常见小坑~你现在的代码里,子类ClassB的method只是和父类ClassA的方法同名,但并没有真正重写它,所以调用的时候会按变量的声明类型(ClassA)来执行方法,导致两种情况都输出1。
要实现你想要的效果,只需要两步修改,利用C#的虚方法和重写机制:
- 把父类的方法标记为可重写的虚方法:在
ClassA的method前加上virtual关键字 - 明确子类重写父类的方法:在
ClassB的method前加上override关键字
修改后的完整代码如下:
public class ClassA { public virtual void method() { Console.WriteLine("1"); } } public class ClassB : ClassA { public override void method() { Console.WriteLine("2"); } }
你原来的数组初始化代码不用做任何改动:
ClassA[] array = new ClassA[20]; array[0] = new ClassB(); array[1] = new ClassA();
现在再调用array[0].method()就会输出2,array[1].method()输出1啦~
原理是:当父类方法被标记为virtual后,C#会在运行时根据对象的实际类型(而不是变量的声明类型)来选择要执行的方法,也就是我们常说的多态特性。如果不加virtual和override,子类的方法只是隐藏了父类的方法,编译时会绑定到声明类型的方法,所以就达不到你想要的效果。
内容的提问来源于stack exchange,提问作者Milan Srdić
相关产品推荐
相关产品推荐

