Интерфейсы, Наследование и ключевое слово «new» - PullRequest
1 голос
/ 10 июня 2011

Мне интересно, может ли кто-нибудь объяснить это мне:

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

1 Ответ

7 голосов
/ 10 июня 2011

Вы заменили реализацию в своих производных классах, не переопределяя их. Если вы используете BaseClass, будет использована оригинальная реализация.

Вам нужно сделать метод в базе виртуальным:

public class BaseClass : IMsg
{

    public BaseClass()
    {

    }

    public virtual string PrintMessage()
    {
        return "BaseClass";
    }
}

и переопределить в производном классе:

public class DerivedClass : BaseClass
{
    public DerivedClass()
    {

    }

    public override string PrintMessage()
    {
        return "DerivedClass";
    }
}

чтобы получить указанное вами поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...