gpt4 book ai didi

c# - 为什么在c#的Inheritance方法中使用override而不是函数

转载 作者:行者123 更新时间:2023-11-30 13:57:25 27 4
gpt4 key购买 nike

我想知道虽然继承可以用来继承派生类中的属性和方法。

为什么我们不在派生类中编写函数,而是将它们声明为覆盖。

以下示例将详细解释我的问题。

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");
}
}

那我该怎么办。在上述情况下,我希望继承基类,但我实现的功能可能不同。在这种情况下,我应该使用覆盖还是编写一个完全不同的方法。

最佳答案

因为如果基类上没有 virtual 方法,您将无法在循环中调用 Act:

foreach (Net net in nets)
{
net.Act();
}

foreach 并不是您唯一可以使用它的地方。假设您有一个名为 Foo 的方法,它以 Net 实例作为参数:

public static void Foo(Net net)
{
net.Act();
}

您仍然可以将 PythonPerl 传递给该方法,它们都将执行自己的 Act 方法逻辑。

virtual 在您想要提供一些基本的默认功能并能够覆盖派生类中的默认功能的任何地方都非常有用。

你应该阅读 Knowing When to Use Override and New Keywords (C# Programming Guide)

关于c# - 为什么在c#的Inheritance方法中使用override而不是函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21012796/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com