Внутренние интерфейсы и классы - PullRequest
2 голосов
/ 15 ноября 2011

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

Я пометил свои классы как внутренние, а их члены как защищенныевнутренние, и мои интерфейсы как внутренние, но чтобы использовать внутренние интерфейсы, мне пришлось сделать некоторые из моих свойств общедоступными.

Я полагаю, и с некоторым ограниченным тестированием, казалось, доказал, что только сборки друзейи классы в моей сборке могут использовать эти внутренние интерфейсы и классы.

Пока класс и интерфейс остаются внутренними, даже если некоторые методы и свойства помечены как открытые, они будут доступнывообще?

Это не так, но я ищу что-то, что я мог пропустить.

Ответы [ 3 ]

2 голосов
/ 15 ноября 2011

Общедоступный член доступен настолько же, насколько и его тип («Обычно доступность члена не превышает доступность типа, в котором он содержится. Однако открытый член внутреннего класса может быть доступен извнесборка, если член реализует методы интерфейса или переопределяет виртуальные методы, которые определены в общедоступном базовом классе. ").

Не укушайтесь проблемой protected internal, хотя: доступен член protected internalк производным классам вне сборки.

Ссылки:

Уровни доступности: http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx

Модификаторы доступа: http://msdn.microsoft.com/en-us/library/ms173121.aspx

2 голосов
/ 15 ноября 2011

Если вы имеете в виду, что защищенные, как в используемой сборке, не могут использовать их напрямую, то да, если interface и class помечены internal, то они не будут видны вне сборки.Подумайте об уровне доступа на интерфейсах и элементах как об отдельных блокировках, через которые можно пройти.

Если вы видите interface на его уровне доступа, то вы можете сохранить ссылку на него, а затем, если выможно видеть свойства / методы на их уровнях доступа, затем вы можете вызывать / устанавливать / получать их.

Имейте в виду, однако, поскольку @phoog указывает, что protected internal немного слабее, чем internal.

Все это говорит о том, что если ваш класс internal реализует интерфейс public, и эти свойства также являются частью интерфейса public, они могут быть видны ... Но это действительно становится неясным...

public interface IVisible
{
    string VisibleProperty { get; set; }
}

internal class InvisibleClass : IVisible
{
    public string VisibleProperty { get; set; }
}

В приведенном выше примере вы могли обращаться к классу InvisibleClass через ссылку IVisible в другой сборке , если , то вы могли бынайти способ создать или получить ссылку на него (например, если он был возвращен из метода фабрики в исходной сборке).

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

1 голос
/ 15 ноября 2011

Ты прав.Так как вы не можете получить доступ к внутренним классам извне (кроме сборок друзей), вы также не можете получить доступ ни к одному из его методов, даже если они являются общедоступными.внутренний класс извне имеет открытый базовый класс или реализует открытый интерфейс.Но вы можете получить доступ только к открытым методам в этом классе, которые находятся как в базовом классе (или интерфейсе), так и переопределены в подклассе (поэтому метод также должен быть virtual или частью интерфейса - что также делает его virtual).Для этого вам нужно получить экземпляр класса, на который ссылается переменная суперкласса (или интерфейса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...