C # прячется с членами - PullRequest
       34

C # прячется с членами

0 голосов
/ 06 января 2010

в приведенном ниже примере, что произойдет?

class Base {
    public int abc = 3;
}

Class Derived : Base {
    public int abc = 2;
}

static void Main() {
   Derived blah = new Derived();
   Console.WriteLine(blah.abc);
}

Я уверен, что вы увидите «2» на своей консоли, но то, что я читаю (и вижу), противоречит этому…

Почему вы видите «3» вместо «2»? Я думал, что члены производных классов «спрятали» тех же членов базовых классов ...

Ответы [ 3 ]

10 голосов
/ 06 января 2010

Ну, у вас есть несколько ошибок компилятора, но вот исправленная версия, основанная на вашем примере.

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. Вы не должны открывать поля для начала, так что обычно это не проблема.

0 голосов
/ 06 января 2010

Конечно, вы увидите 2 . Почему ты думал, что увидишь 3?

Но вы получите предупреждение:

Derived.abc скрывает унаследованный член 'Base.abc. Используйте новое ключевое слово, если сокрытие было предназначено.

Так что вы можете решить это, выполнив:

class Derived : Base {
    public new int abc = 2;
}
0 голосов
/ 06 января 2010

Игнорирование очевидных и многочисленных ошибок в вашем коде: O, ваше утверждение, что «Я уверен, что вы увидите« 2 »на вашей консоли», верно, вы сделаете, и я сделаю!

Вы должны действительно пользователь

class Derived : Base {
    public new int abc = 2;
}

если вы намерены скрыть наследуемое значение

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