微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在c#的继承方法中使用override而不是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”函数,为什么我们要选择覆盖基函数

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 举报,一经查实,本站将立刻删除。

相关推荐