Производный класс не вызывает метод базового класса
class MyBaseClass
{
virtual public void Print()
{
Console.WriteLine("This is the base class.");
}
}
class MyDerivedClass : MyBaseClass
{
override public void Print()
{
Console.WriteLine("This is the derived class.");
}
}
class Program
{
static void Main()
{
MyDerivedClass derived = new MyDerivedClass();
MyBaseClass mybc = (MyBaseClass)derived;
derived.Print();
mybc.Print();
}
}
ВЫХОД:
This is the derived class.
This is the derived class.
Я не понимаю, почему второй вызов печатает метод print() производного класса, потому что я приводил объект mybc к базовому классу. Я ожидаю, что вместо этого будет напечатан метод печати базового класса. Я что-то здесь упускаю?
3 ответа
Тип переменной и тип экземпляра - это два разных типа. Приведение не меняет тип экземпляра.
Когда вы объявляете метод виртуальным / абстрактным, вы говорите, что хотите, чтобы тип экземпляра определял поведение при вызове.
Также обратите внимание, что это присваивание допустимо - синтаксис преобразования не требуется для изменения типа переменной с подкласса на базовый класс. Этот вид приведения может быть сделан неявно.
MyBaseClass mybc = derived;
Вы переопределили это. Он вызывает только производный метод. Вы должны явно вызвать метод базового класса:
override public void Print() {
base.Print();
Console.WriteLine("This is the derived class.");
}
Весь смысл переопределения виртуальных методов заключается в том, что вызывается версия для базового (во время выполнения) типа объекта, а не для статического (во время компиляции) типа, даже если вы вызываете его через тип, объявленный как базовый. учебный класс.
Так что это ведет себя именно так, как и должно.
Если бы это было не так, это сделало бы большую часть полезности иерархии классов бесполезной, потому что вы не могли изменить поведение типа класса, передаваемого методу, передав ему настроенный производный класс.