[英]Why to use override in Inheritance method of c# instead of function
我想知道虽然继承可以用来继承派生类中的属性和方法。
为什么我们不在派生类中编写函数而是将它们声明为覆盖。
以下示例将详细解释我的问题。
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");
}
}
那我该怎么办 在上面的例子中,我希望继承基类,但我实现的功能可能不同。 在这种情况下,我应该使用覆盖或写一个完全不同的方法。
因为在您的基类上没有该virtual
方法,您将无法使用循环调用Act
:
foreach (Net net in nets)
{
net.Act();
}
并且foreach
不是唯一可以使用它的地方。 想象一下,你有一个名为Foo
的方法,它将Net
实例作为参数:
public static void Foo(Net net)
{
net.Act();
}
您仍然可以将Python
和Perl
都传递给该方法,并且它们都将执行自己的Act
方法逻辑。
virtual
在您想要提供一些基本的默认功能的任何地方都很有用,并且能够在派生类中override
该默认功能。
new
关键字用于方法隐藏,主要用于版本控制 ,但请注意,这两个方法在派生类中仍然可用! 并且可以通过简单的cast
访问。 但另一方面,使用方法覆盖,您覆盖行为(这就是我们所说的多态 ),因此在派生类中,重写的方法将完全替换基本方法,因此无法通过派生类的实例进行访问即使是对基层的向上倾斜! 因为虚方法被重写方法替换。 让我用一个例子向您展示这个概念:
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()
在上面的示例中,act函数可以声明为“NEW”函数,为什么我们应该选择覆盖基函数
继承旨在使用基类提供的内容以及必要时的额外功能。 如果你不想使用基类的功能,为什么你会在第一时间继承?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.