9

Я написал следующий код:C# доступа к защищенным членам в производном классе

public class A        
{ 
    protected string Howdy = "Howdy!";  
} 

public class B : A       
{ 
    public void CallHowdy() 
    { 
     A a = new A(); 
     Console.WriteLine(a.Howdy); 
    } 
} 

Теперь в VS2010 это приводит к следующей ошибке компиляции:

Cannot access protected member 'A.a' via a qualifier of type 'A'; the qualifier must be of type 'B' (or derived from it).

Это кажется совершенно нелогичным для меня - почему я не могу получить доступ к полю protected экземпляра класса из метода класса, который получен из него?

Итак, Почему это происходит?


Найден Строгий ответ - http://blogs.msdn.com/b/ericlippert/archive/2005/11/09/491031.aspx

+1

+1 для очень четко написанного вопроса. :) – Almo

+0

Что вы можете сделать, это создать защищенный статический метод, который обеспечивает доступ только к производному классу, например: public class A { { защищенная строка Howdy = "Howdy!"; } общественного класс B: { общественной недействительная CallHowdy() { А а = новый А(); Console.WriteLine (a.Хауди); } } –

ответ

7

Вы не получаете доступ к нему из класса, вы 'пытаюсь получить доступ к переменной, как если бы это было public. Вы не ожидали бы это компилировать, и это в значительной степени то, что вы пытаетесь сделать:

public class SomethingElse 
{ 
    public void CallHowdy() 
    { 
     A a = new A(); 
     Console.WriteLine(a.Howdy); 
    } 
} 

Там нет никакой связи, и это звучит, как вы смущены, почему это поле не является публичным.

Теперь вы можете сделать это, если вы хотите:

public class B : A 
{ 
    public void CallHowdy() 
    { 
     Console.Writeline(Howdy); 
    } 
} 

Поскольку B унаследовал данные от A в данном случае.

+0

Ну, на самом деле, меня смутила возможность сделать это в 'PHP5' (я также задал этот вопрос: http://stackoverflow.com/questions/10653991/php5-member-visibility). Разница, подобная этому, должна, вероятно, иметь вескую причину, не так ли? –

+0

Ну, PHP кажется странным там, поскольку он, кажется, разоблачает защищенную переменную незаконно. В C# существуют более строгие границы типов, чем PHP. – Tejs

+0

Меня также смущает тот факт, что все в соответствующем 'PHP' вопросе продолжают говорить мне такие вещи, как *« Почему он не должен быть доступен? Это совершенно верно ». * Я предполагаю, что этот вопрос связан скорее с некоторыми привычками кодирования. –

3

Вы могли бы сделать

public class B : A       
{ 
    public void CallHowdy() 
    { 
     Console.WriteLine(Howdy); 
    } 
} 

В коде, вы пытаетесь получить доступ к Howdy снаружи в A, а не изнутри B Здесь вы находитесь внутри B и поэтому можете получить доступ к защищенному элементу в A.

0

Защищенный член базового класса доступен в производном классе, только если доступ осуществляется через производный тип класса.

Вы получаете сообщение об ошибке, потому что, поскольку А не является производным от B.

http://msdn.microsoft.com/en-us/library/bcd5672a(v=vs.90).aspx

0

A защищаемого элемента является видимым только для себя и вывел членов. В вашем случае объявление A подразумевает, что доступны только публичные члены, так же, как если бы вы создали экземпляр A из любого другого класса. Вы могли бы просто написать это. Хауди, потому что из-за цепи деривации Howdy доступен изнутри класса B.

Смежные вопросы