Прежде чем продолжить изложение, следует дать определение некоторым терминам. Когда для классаGenуказывается аргумент типа, напримерintилиstring,то создается так называемый в C#закрыто сконструированный тип.В частности,Genявляется закрыто сконструированным типом. Ведь, по существу, такой обобщенный тип, какGen,является абстракцией. И только после того, как будет сконструирован конкретный вариант, напримерGen,создается конкретный тип. А конструкция, подобнаяGen,называется в C#открыто сконструированным типом, поскольку в ней указывается параметр типаТ,но не такой конкретный тип, какint.

В C# чаще определяются такие понятия, какоткрытыйизакрытый типы.Открытым типом считается такой параметр типа или любой обобщенный тип, для которого аргумент типа является параметром типа или же включает его в себя. А любой тип, не относящийся к открытому, считается закрытым.Сконструированным типомсчитается такой обобщенный тип, для которого предоставлены все аргументы типов. Если все эти аргументы относятся к закрытым типам, то такой тип считается закрыто сконструированным. А если один или несколько аргументов типа относятся к открытым типам, то такой тип считается открыто сконструированным.

Различение обобщенных типов по аргументам типа

Что касается обобщенных типов, то следует иметь в виду, что ссылка на один конкретный вариант обобщенного типа не совпадает по типу сдругимвариантом того же самого обобщенного типа. Так, если ввести в приведенную выше программу следующую строку кода, то она не будет скомпилирована.

iOb = strOb; // Неверно!

Несмотря на то что обе переменные,iObиstrOb,относятся к типуGen,они ссылаются на разные типы, поскольку у них разные аргументы.

Повышение типовой безопасности с помощью обобщений

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

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

// Класс NonGen является полным функциональным аналогом // класса Gen, но без обобщений.

using System;    ,

Перейти на страницу:

Похожие книги