Is inaccessible due to its protection level недоступен из-за уровня его защиты)

Class Classl

Namespace ChO9ExO2

{

/// <summary>

/// Краткое описание класса Classl.

/// </summary>

{

static void Main(string[] args)

{

MyExternalClass myObj = new MyExternalClass();

Console.WriteLine(myObj.ToString());

}

}

}

14. Запустите приложение.

В этом практикуме было создано два проекта, один из которых является библиотекой классов, а второй — консольным приложением. Проект, представляющий собой библиотеку классов,— ChO9ClassLib — включает два класса: MyExternalClass, являющийся общедоступным и MyInternalClass, к которому имеется только внутренний доступ. Консольное приложение — chO9ExO2 — содержит простой код, использующий библиотеку классов. Для того, что бы использовать классы из ChO9ClassLib, в приложение ChO9ExO2 была добавлена ссылка на DLL, которая была создана проектом библиотеки классов.

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

После добавления ссылки была получена возможность просмотреть перечень доступных классов с помощью Object Browser. Поскольку один из двух классов — MyInternalClass — является внутренним, то он не виден: этот класс недоступен внешним проектам. Напротив, класс MyExtemalClass доступен, и он используется в консольном приложении.

Модно попробовать заменить код в консольном приложении на код, который попытается использовать внутренний класс следующим образом:

static void Main (string [] args)

{

MyInternalClass myObj = new MyInternalClass();

Console.WriteLine(myObj .ToStringO );

}

При попытке откомпилировать такой код будет получено следующее сообщение об ошибке:

C:\BegCSharp\Chapter9\ChO9ExO2\Class1.cs(13):<Ch09ClassLib.MylnternalClass>

(C:\BegCSharp\Chapter9\ChO9ExO2\Classl.cs(13):класс'ChO9ClassLib.MyInternalClass

Этот способ использования классов из внешних модулей является ключевым при программировании на С# в .NET Framework. Фактически так мы поступаем со всеми классами в .NET Framework, поскольку работа с ними организована аналогичным образом.

Сравнение интерфейсов и абстрактных классов

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