2013-06-29 3 views
2

Мне сказали, что защищенную переменную в базовом классе можно получить в производном классе либо с использованием , либо this. Я сейчас полностью смущен, потому что ключевое слово относится к текущему классу (производному классу).различие между ключевым словом 'base' и 'this'

public class A 
{ 
    protected int i; 
} 
public class B :A 
{ 
    void Display() 
    { 
    this.i=10; 
    // (or) 
    base.i=10; 
    } 
} 

Есть ли разница в технических характеристиках? Прежде всего, сегодня я размышляю над тем, почему я не могу создать объект A внутри метода Display() и получить доступ к переменной i через этот объект, поскольку само определение защищенного доступа говорит, что к нему можно получить доступ в любом производном классе. Люди, я видел некоторые потоки, однако то, что они говорят, мы не можем создать объект и получить доступ к защищенным членам. Я чувствую, это довольно противоречит определению.

Может кто-то может понравиться мне объяснить оба моих выше вопросы

+0

* Есть ли какие-либо технические отличия? * Нет, ни 'this.i', ни 'base.i' будет компилироваться, потому что' i' определен в 'A', а' B' - другой класс. Вы имели в виду сказать 'public class B: A'? –

+0

'this',' base' в вашем коде не смогут получить доступ к 'i'..you не наследуют A – Anirudha

+0

Предполагая, что вы намеревались наследовать от' A' (но в остальном не оставляйте вещи одинаковыми), тогда нет разница с текущим кодом. Однако, если вы должны добавить поле 'i' в класс' B', то 'this.i' будет ссылаться на это поле, тогда как' base.i' все равно будет ссылаться на версию базового класса. – dlev

ответ

0

Давайте B расширить класс, поэтому B унаследовать я из A:

public class A { 
    protected int i; 
} 
public class B : A { 
    void Display() { 
     i = 10; // this.i 
    } 
} 
+2

... Вы, кажется, разместили это, прежде чем закончите писать. – mcmonkey4eva

+2

Как это наберет вам больше репутации? Если ваш ответ не так хорош, как кто-то elses, я не собираюсь писать +1, потому что они делают 1-й пост. –

+0

В 56 очках эта стратегия явно работает ... – JMK

5

Это довольно просто:

this относится к текущему объекту (EG, если метод похож на void mymethod(int myvar), а класс имеет myvar, определенный в нем, вы можете использовать myvar для ссылки на аргумент и this.myvar для ссылки на тот, который принадлежит классу.)

base относится к базовому классу (класс, из которого получен ваш класс). (EG, если вы переписываете метод Update, в конце его вы можете позвонить base.Update();, чтобы позвонить по первому методу.)

+0

прекрасно объяснил .... –