Ну, у вас есть несколько ошибок компилятора, но вот исправленная версия, основанная на вашем примере.
class Base {
public int abc = 3;
}
class Derived : Base {
public int abc = 2;
}
static void Main(string[] args)
{
Derived foo = new Derived();
Console.WriteLine(foo.abc);
Base bar = new Derived();
Console.WriteLine(bar.abc);
}
Первая строка выведет 2
. Вторая строка выведет 3
. Причина в том, что, если вы явно не переопределите член базового класса, он будет применяться только к экземплярам конкретного класса.
В вашем производном классе вы, по сути, используете ключевое слово-модификатор new
без явного его использования. Ключевое слово new
скрывает базовый член, однако, если конкретный класс приведен в качестве его базового типа, новое свойство не используется и не может быть доступно до тех пор, пока оно не будет «свернуто». снова к конкретному классу.
Во втором примере класс Derived
приводится как Base
, поэтому он будет использовать свойство Base
abc
. Если бы вы использовали ключевое слово override
, то вторая строка также вывела бы 2
.
Редактировать: Имейте в виду, что для того, чтобы иметь возможность использовать override
в классе Derived
, необходимо пометить Base.abc
ключевым словом virtual
. Кроме того, вы не можете сделать поля virtual
. Вам нужно использовать Свойства , чтобы использовать ключевое слово virtual
. Вы не должны открывать поля для начала, так что обычно это не проблема.