加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 从基类调用子类的新方法

发布时间:2020-12-15 19:34:59 所属栏目:百科 来源:网络整理
导读:我有类似这样的课程 namespace ConsoleApplication1{ class Program { static void Main(string[] args) { A a = new C(); a.method(); Console.ReadLine(); } } public class A { public virtual void method() { Console.WriteLine("METHOD FROM A"); } }
我有类似这样的课程

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            A a = new C();

            a.method();
            Console.ReadLine();
        }
    }

    public class A
    {
        public virtual void method()
        {
            Console.WriteLine("METHOD FROM A");
        }
    }

    public class B : A { }

    public class C : B
    {
        public override void method()
        {
            Console.WriteLine("METHOD FROM C");
        }
    }
}

它工作正常,打印“METHOD FROM C”

如果我有这样的情况

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            A a = new C();

            a.method();
            Console.ReadLine();
        }
    }

    public class A
    {
        public void method()
        {
            Console.WriteLine("METHOD FROM A");
        }
    }

    public class B : A { }

    public class C : B
    {
        public new void method()
        {
            Console.WriteLine("METHOD FROM C");
        }
    }
}

它打印“METHOD FROM A”.如果没有采用带有覆盖的强制转换或更改方法声明,如何获得第一个示例的相同行为?

解决方法

你不能 – 这种行为上的差异是使用虚拟/覆盖的重点.

当你用“new”声明一个方法时,你会说“我知道我隐藏了一个具有相同签名的方法,而不是覆盖它;我不想要多态行为.”

同样,当您声明一个方法而不指定“virtual”时,您会说“我不希望子类能够覆盖此方法”.

你为什么要这样做?你真的只是试图覆盖一个尚未声明为虚拟的方法吗?如果是这样的话,那就没有办法了 – 而且有充分的理由.如果作者没有在设计具有多态性的类时,如果能够覆盖该方法,则很容易破坏.

当然,如果您将变量声明为子类的类型,如下所示:

C c = new C();
c.method();

那将调用新声明的方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读