Ограничение доступа к свойству в подклассе - PullRequest
1 голос
/ 03 мая 2011

У меня есть класс с открытым свойством, доступ к которому я хочу ограничить _for_some_modules_. (Модули, которые используют этот класс, находятся в разных сборках, поэтому внутренняя не помогает.)

Моей первой мыслью было создание подкласса и предоставление доступа к производному свойству частным или защищенным, но это невозможно. Производное свойство должно иметь те же права доступа. (См. http://msdn.microsoft.com/en-us/library/75e8y5dd.aspx)

Есть предложения? Я предполагаю, что это обычная задача сделать более ограниченный вариант класса? Спасибо!

Ответы [ 4 ]

2 голосов
/ 03 мая 2011

Вы можете использовать InternalsVisibleToAttribute, чтобы сделать internal члены класса видимыми для других сборок (сколько угодно). На странице документации есть пример.

1 голос
/ 03 мая 2011

Создание более ограниченных подклассов на самом деле не является распространенным явлением, потому что это сломало бы потребителей базового класса, которые предполагали, что они имеют доступ к публичным членам. В целом, ваши занятия должны начинаться с ограничений и получать меньше, так как они специализируются, а не наоборот.

Концепция, которую вы ищете, называется «другом» в других языках, но C # (намеренно) не реализует их. InternalsVisibleToAttribte настолько близок, насколько это возможно, но он применяется на уровне сборки, поэтому он может не сработать.

Без дополнительной информации о том, почему вы пытаетесь ограничить доступ таким образом, трудно дать какие-либо хорошие альтернативы общего назначения. Модификаторы доступа, такие как public / private / и т. Д., Не предназначены для обеспечения безопасности, так как Reflection предоставит вам доступ для чтения / записи всего, что угодно. Это скорее подсказка потребителям о том, что безопасно использовать - публичные участники обычно остаются стабильными в новых версиях, в то время как частные (детали реализации) чаще меняются.

1 голос
/ 03 мая 2011

Я полагаю, что обычным делом является создание более ограниченного варианта класса?

Это не обычное задание, поскольку оно нарушает принцип подстановки Лискова - вы не можете использовать подкласс так же, как вы используете базовый класс в отношении свойства, к которому вы ограничиваете доступ.Вы должны рассмотреть возможность рефакторинга вашей иерархии классов.

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

0 голосов
/ 03 мая 2011

Вы всегда можете сделать что-то вроде этого:

class MyBaseClass
{
    protected string MyRestrictedProperty { get; set; }
}

class MyClass : MyBaseClass
{
    public string MyPublicProperty 
    {
        get { return MyRestrictedProperty;  }
        set { MyRestrictedProperty = value; }
    }
}
...