Вопрос по visual-studio-2010, c# – C # доступ к защищенному члену в производном классе [дубликат]

9

This question already has an answer here:

Why can't I access C# protected members except like this? 7 answers

I wrote the following code:

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 поле экземпляра класса из метода класса, который является производным от него?

Так,why does this happen?

Found a strict answer - http://blogs.msdn.com/b/ericlippert/archive/2005/11/09/491031.aspx

+1 за очень четко написанный вопрос. :) Almo
Что вы можете сделать, это создать защищенный статический метод, который предоставляет доступ только к производному классу, например так: public class A {protected string Howdy = & quot; Howdy! & Quot ;; } открытый класс B: A {public void CallHowdy () {A a = new A (); ЕЫпе (a.Howdy); }} Michael Erickson

Ваш Ответ

4   ответа
0

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

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

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

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 в этом случае.

Error: User Rate Limit ExceededPHPError: User Rate Limit Exceeded"Why shouldn't it be accessible? That's perfectly valid".Error: User Rate Limit Exceeded Yippie-Ki-Yay
Error: User Rate Limit ExceededPHP5Error: User Rate Limit Exceededstackoverflow.com/questions/10653991/php5-member-visibilityError: User Rate Limit Exceeded Yippie-Ki-Yay
BError: User Rate Limit Exceededown instanceError: User Rate Limit Exceededother instances.
Error: User Rate Limit Exceeded
0

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

3

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

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

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

Похожие вопросы