Когда вы определяете метод в производном классе, который имеет ту же сигнатуру, что и в базовом классе, вы скрываете его.
Это означает, что когда вы объявляете переменную с базовым типом и инициализируете ее с типом Dervied, будет использоваться метод из базового класса. Вот что происходит в вашем коде.
В более общем смысле: когда вы скрываете методы, то и версию метода, который будет использоваться, cmoes из класса, с которым вы его объявили.
Так что, если у вас был другой класс CAble
и вы использовали как:
BAble c = new CAble();
b.f();
тогда результат будет ---->> B - Able
.
В вашем случае вы объявляете переменную как IAble
. Он не имеет реализации, поэтому он смотрит на реализацию, которая определена в классе AAble
. Другие классы только скрывают метод.
Чтобы скрыть метод, вы можете указать оба метода с одинаковой сигнатурой. Но вы всегда должны использовать new
keywrods, чтобы явно скрыть метод (который укажет, что скрытие было умышленно).
То, что вы ожидаете, это переопределение методов, которые выполняются с помощью override
keywaord при определении метода.
Чтобы переопределить метод, он должен быть помечен как virtual
(если он имеет реализацию) или abstract
(если он не имеет реализации) в базовом классе.