Чтобы расширить ответ Бранко Димитриевича, это возможно из-за принципа замены Лискова .
В своем комментарии вы сказали
базовый класс и производный класс могут иметь свои собственные различные и разные определения метода / свойства / поля. Так логично, что это утверждение не должно компилироваться ... но оно делает ... я не знаю обоснования этого
Это правда, что базовый класс и производный класс имеют свои собственные определения членов, но они не полностью различны и различны. В частности, каждый член базового класса также является членом производного класса. Например, вы всегда можете сказать
object o = anything;
Console.WriteLine(o.ToString());
Console.WriteLine(o.GetHashCode());
Console.WriteLine(o.GetType().Name);
Вы можете сделать это, потому что у каждого объекта есть методы ToString, GetHashCode и GetType , потому что тип времени выполнения каждого объекта наследует прямо или косвенно от объекта.
Вы можете сделать то же самое с базовым классом, отличным от object:
class X
{
public string Exclamation { get { return "Inherit this!"; } }
}
class Y : X
{
public string Question { get { return "What's up with that?"; } }
}
Тогда совершенно законно сказать
X x = new Y();
Console.WriteLine(x.Exclamation);
Но, конечно, вы не можете сказать
X x = new Y();
Console.WriteLine(x.Question); //does not compile!
Чтобы использовать свойство Question, вам нужно иметь ссылку типа Y.
Напомним: поскольку каждый член базового класса также является членом производного класса, вы можете использовать экземпляр производного класса, как если бы он был экземпляром базового класса. Экземпляр производного класса содержит все члены базового класса.
Вы подняли тему абстрактных классов. Конечно, абстрактный класс не может быть создан; Вы можете создать экземпляр класса, производного от абстрактного класса. Однако это не влияет на принцип подстановки, за исключением того, что переменная, тип которой является абстрактным классом , должна ссылаться на экземпляр производного типа, тогда как переменная, тип которой не является абстрактным ( unsealed) класс может ссылаться на экземпляр производного типа.