2010-01-06 5 views
0

в приведенном ниже примере, что произойдет?C# скрывается с членами

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' ? Я думал, что члены производных классов «спрятали» одни и те же члены базовых классов ...

ответ

0

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

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

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

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

0

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

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

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

Таким образом, вы можете решить, что делать:

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

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

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 modifier keyword, не используя его явно. Ключевое слово newскрывает базовый элемент, однако, если конкретный класс отличен в качестве базового типа, новое свойство не будет использоваться и не может быть доступно до тех пор, пока оно не будет «опущено» к конкретному классу.

Во втором примере Derived класса отливается как Base, поэтому он будет использовать свойство Baseabc. Если вы должны были использовать override keyword, тогда вторая строка также выведет 2.

Edit: Имейте в виду, что для того, чтобы иметь возможность использовать override на Derived класса, вам нужно отметить Base.abc с virtual keyword. Кроме того, вы не можете сделать fieldsvirtual. Для использования ключевого слова virtual необходимо использовать Properties. Вы не должны открывать поля, чтобы начать с них, так что это обычно никогда не проблема.

+0

Ударьте меня в это. Хороший ответ! –

+0

Ну, я думал, что это давным-давно, но я всегда получаю: "error CS0106: Модификатор 'override' недопустим для этого элемента" – Xenoprimate

+0

Вам нужно добавить свойство 'virtual' в базовый класс ', чтобы использовать' override' в производном классе. –