为什么在c#的继承方法中使用override而不是function
发布时间:2020-12-16 01:59:22 所属栏目:百科 来源:网络整理
导读:我想知道虽然继承可以用来继承派生类中的属性和方法. 为什么我们不在派生类中编写函数而是将它们声明为覆盖. 以下示例将详细解释我的问题. class Net{ public virtual void Act() { }}class Perl : Net{ public override void Act() { Console.WriteLine("Pe
我想知道虽然继承可以用来继承派生类中的属性和方法.
为什么我们不在派生类中编写函数而是将它们声明为覆盖. 以下示例将详细解释我的问题. class Net { public virtual void Act() { } } class Perl : Net { public override void Act() { Console.WriteLine("Perl.Act"); } } class Python : Net { public override void Act() { Console.WriteLine("Python.Act"); } } // Use base class and derived types in a List. List<Net> nets = new List<Net>(); nets.Add(new Perl()); nets.Add(new Python()); // Call virtual method on each instance. foreach (Net net in nets) { net.Act(); } 在上面的示例中,act函数可以声明为“NEW”函数,为什么我们要选择覆盖基函数?
class Net { public virtual void Act() { } public virtual void secondMethod() { } } class Perl { public override void Act() { Console.WriteLine("Perl.Act"); } public override void secondMethod() { Console.WriteLine("Perl.Act"); } } class Python { public new void Act() { Console.WriteLine("Python.Act"); } public override void secondMethod() { Console.WriteLine("Perl.Act"); } } 那我该怎么办 解决方法
new关键字用于方法隐藏,主要用于版本控制,但请注意,这两个方法在派生类中仍然可用!并且可以通过简单的演员表访问.但另一方面,使用方法覆盖,您覆盖行为(这就是我们所说的多态),因此在派生类中,重写的方法将完全替换基本方法,因此无法通过派生类的实例进行访问即使是对基层的向上倾斜!因为虚方法被重写方法替换.
让我用一个例子向您展示这个概念: public class Base { public virtual void VirtualMethod() { } public void NewMethod() { } } public class Derived : Base { public override void VirtualMethod() { } public new void NewMethod() { } } ... Base derived = new Derived(); derived.VirtualMethod(); // Derived.VirtualMethod() derived.NewMethod(); // Base.NewMethod() ((Derived)derived).NewMethod(); // Derived.NewMethod() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |