我想知道虽然继承可以用来继承派生类中的属性和方法.
为什么我们不在派生类中编写函数而是将它们声明为覆盖.
以下示例将详细解释我的问题.
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”函数,为什么我们要选择覆盖基函数?
Edit: Suppose i have a case as follow
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()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。