C# защитил участников, к которым получают доступ через переменную базового класса [дубликат]

У меня есть это в моем .vimrc:

nnoremap ; :set invhlsearch<CR>

Таким образом, ; переключит поисковое выделение. Обычно, ; ключ повторяет последнюю команду t/T/f/F, но я никогда действительно использовал ту функциональность. Я нахожу эту установку намного более полезной, потому что я могу изменить поиск, выделяющийся на и прочь очень быстро, и могу легко получить смысл того, где мои результаты поиска, сразу.

11
задан Grace Note 18 May 2010 в 14:53
поделиться

5 ответов

Это часто задаваемый вопрос. Чтобы выяснить, почему это незаконно, подумайте, что может пойти не так.

Предположим, у вас есть другой производный класс Frob, производный от Base. Теперь вы передаете экземпляр Frob Der.B. Можно ли получить доступ к Frob.Foo из Der.B? Нет, абсолютно нет. Frob.Foo защищен; он должен быть доступен только из Frob и подклассов Frob. Дер не является Фробом и не является подклассом Фроба, поэтому он не получает доступа к защищенным членам Фроба.

Если это непонятно, см. Мою статью на эту тему:

http://blogs.msdn.com/ericlippert/archive/2005/11/09/491031.aspx

22
ответ дан 3 December 2019 в 02:40
поделиться

В B вы пытаетесь получить доступ к защищенному члену другого класса. Тот факт, что вы наследуете этот класс, не имеет значения. В D вы получаете доступ к защищенному члену базового класса вашего текущего класса. В этом контексте вы можете получить доступ к чему угодно из Der и к защищенным членам типа, от которого он наследуется.

4
ответ дан 3 December 2019 в 02:40
поделиться

В сценарии, который вы пытаетесь использовать, вы захотите использовать «internal» для int Foo.

0
ответ дан 3 December 2019 в 02:40
поделиться

Проще говоря, protected разрешает доступ к подклассам.

В:

private void B(Base b) { Foo = b.Foo; }

Вы пытаетесь получить доступ к защищенному члену, к которому у вашего экземпляра Der нет доступа. У него был бы доступ к нему, только если бы это был базовый класс вашего текущего экземпляра Der (this).

private void D(Der d) { Foo = d.Foo; } // OK

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

2
ответ дан 3 December 2019 в 02:40
поделиться

Это ограничение можно обойти, объявив статический метод в базовом классе:

public class Base
{
    protected int Foo;

    protected static int GetFoo(Base b)
    {
        return b.Foo;
    }
}

public class Der : Base
{
    private void B(Base b) { Foo = GetFoo(b); } // OK
}
3
ответ дан 3 December 2019 в 02:40
поделиться
Другие вопросы по тегам:

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