【问题标题】:C# abstract, subclass, How to explain this result [duplicate]C#抽象,子类,如何解释这个结果[重复]
【发布时间】:2014-12-09 00:03:50
【问题描述】:

问题:有两个类,A 和 B

public abstract class A
{
    public A()
    {
        Console.WriteLine("A");
    }
    public virtual void Fun()
    {
        Console.WriteLine("A.Fun()");
    }
}
public class B : A
{
    public B()
    {
        Console.WriteLine("B");
    }
    public new void Fun()
    {
        Console.WriteLine("B.Fun()");
    }

}

如果运行:

    public void Main()
    {
        A a = new B();
        a.Fun();
    }

输出是:

A
B
A.Fun()

如何解释这个结果,我知道它与抽象和子类有关,但我不知道如何解释。请帮忙。

【问题讨论】:

  • 如果您想覆盖该方法,您可能需要使用override 关键字而不是new
  • 如果您想知道“A” - 无论如何都会从Bs 调用基类构造函数
  • @mikez - 将此作为答案并稍微解释一下 newoverride 之间的区别 - 会很高兴地支持它
  • @Carsten 随时发布答案并获得积分。我没有时间写出完整的答案。
  • @mikez - 另一个已经做过的NP

标签: c# subclass abstract


【解决方案1】:

你需要区分newoverride

  • new:这 覆盖触及继承的基本方法。 B 中标记为new 的方法仅在您对B 类型的对象(例如((B)a).Fun())调用时调用,但在调用映射到类型对象的B 类型的实例时不会调用A。可用于任何方法(即“隐藏基本方法”)。
  • override 确实 touch 继承,并且 真的 覆盖了基本功能。 a.Func() 将调用B 中定义的方法。只能用于标记为 virtual 的基本方法。

【讨论】:

    猜你喜欢
    • 2013-06-17
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 2014-01-21
    相关资源
    最近更新 更多