接口,继承和'new'关键字

Asd*_*dfg 1 c# inheritance interface

我想知道是否有人可以向我解释这个:

class Program
{
    static void Main()
    {
        AnotherDerivedClass d = new AnotherDerivedClass();
        Console.WriteLine(d.PrintMessage());

        IMsg m = d as IMsg;
        //Why this prints BaseClass.
        //How does it know that IMsg is implemented in the BaseClass.
        Console.WriteLine(m.PrintMessage());

        IMsg n = d as DerivedClass;
        //Why this prints BaseClass and not DerivedClass
        Console.WriteLine(n.PrintMessage());

        Console.Read();
    }
}

public interface IMsg
{
    string PrintMessage();
}

public class BaseClass : IMsg
{
    public string PrintMessage()
    {
        return "BaseClass";
    }
}

public class DerivedClass : BaseClass
{
    public new string PrintMessage()
    {
        return "DerivedClass";
    }
}

public class AnotherDerivedClass : DerivedClass
{
    public new string PrintMessage()
    {
        return "AnotherDerivedClass";
    }
}
Run Code Online (Sandbox Code Playgroud)

Fem*_*ref 7

您已在派生类中替换了实现,而不是覆盖它们.如果您使用BaseClass,将使用原始实现.

您需要在基本虚拟中创建方法:

public class BaseClass : IMsg
{

    public BaseClass()
    {

    }

    public virtual string PrintMessage()
    {
        return "BaseClass";
    }
}
Run Code Online (Sandbox Code Playgroud)

并在派生类中重写:

public class DerivedClass : BaseClass
{
    public DerivedClass()
    {

    }

    public override string PrintMessage()
    {
        return "DerivedClass";
    }
}
Run Code Online (Sandbox Code Playgroud)

获取您指定的行为.

  • @Asdfg,这不是它的工作原理.当基本方法没有做你想做的事情而且它不是"虚拟"并且不能被覆盖时,使用`new`.但是,只要您通过对派生类型的引用进行操作,这只会*隐藏*基本实现.通过*基类引用对象*将继续使用基本行为.这就是为什么在你真正打算在派生类中重写的基本方法上使用`virtual`修饰符是绝对可取的. (2认同)