Обмеження узагальнень. NET в Visual C # (Sharp)

Узагальнення NET розглядалися в декількох розділах цієї книги Дополнители аспектом узагальнень NET є обмеження, які можна іспользать для оптимізації коду Узагальнення NET не обовязково повинні бути просто чорними ящиками. Код може звертатися до методів і властивостей, за умови, що в ньому застосовуються обмеження

Є три типи обмежень: class, new і type Як правило, обмеження давлять у вигляді оператора where, як показано в наступному коді:

class Example&ltDataType&gt where DataType : new() {

}

Код, виділений жирним шрифтом, створює враження організації Наследова, де клас DataType є похідним класом new Частково так воно і є, оскільки дія створення похідного класу є створенням ної функціональності Але в даному контексті ми не створюємо підклас параметра узагальнення NET, а вказуємо, що параметр узагальнення NET має цей вид фуніональності

Обмеження type

Обмеження type дозволяють асоціювати тип з параметром узагальнення NET Наприклад, припустимо наступне визначення інтерфейсу:

interface IExample { void Method))

}

Додавання обмеження IExample до параметру узагальнення NET дозволяє визна клас наступним чином:

class ExampleMgr&ltDataType&gt where DataType : IExample { DataType _inst

public ExampleMgr(DataType inst) {

_inst = inst

}

public void DoSomething() {

_instMethod()

}

}

У прикладі обмеження IExample дозволяє розробнику викликати Method Без цього обмеження звернення до Method викликало б помилку компілятора

Але чи дає небудь перевага така можливість звернутися до методу Зрештою, можна було б написати код класу ExampieMgr, не вдаючись до узагальнення NET, наступним чином:

class ExampieMgr { IExample  _inst

public ExampieMgr(IExample inst) {

_inst = inst

}

public void DoSomething() {

_instMethod()

}

}

В даному випадку код з використанням узагальнення NET і код з використанням інтерфейсу роблять одне те ж, і застосування узагальнення NET не дає жодної переваги Але це не завжди так Розглянемо наступну модифікацію класу

ExampieMgr:

class ExampleMgr&ltDataType&gt where DataType : IExample  { DataType _inst

public ExampieMgr(DataType inst) {

_inst = inst

}

public void DoSomething() {

_instMethod()

}

public DataType Inst { get {

return _inst

&gt&nbsp

&gt&nbsp

}

У цьому випадку використання узагальнення NET дозволяє створення властивості, оащающегося до базового типу Якби був застосований код на основі інтерфейсу, то властивість inst повинно б було бути типу IExample, а щоб отримати той же самий ефект, що і з використанням узагальнення NET, необхідно було б волнять приведення типів Хоча необхідність виконання приведення типів і не означає кінець світу, це становить певні незручності і не забез-

чивает типовий безпеки, т к ми не знаємо, чи буде приведення успішним доти, поки не виконаємо код

В якості обмежень можна додати кілька інтерфейсів і класів, але в певних межах Ці межі такі ж, як і при створенні похідного класу або інтерфейсу:

• можна створювати підклас тільки одного класу

• можна створювати стільки похідних інтерфейсів, скільки завгодно, але всі вони повинні оголошуватися після класу

Призначення обмеження new полягає в тому, щоб дозволити створення екземяра типу даних, як показано в наступному прикладі:

class Example&ltDataType&gt where DataType : new() { DataType _value

public Example() {

_value = new DataType()

}

}

Без обмеження new код, виділений жирним шрифтом, що не скомпіліруется Консуктор, який визначається з обмеженням new, не приймає параметрів, що може паза незручним Зрештою, ми можемо захотіти створити екземпляр типу з яким-небудь станом У такому випадку можна створити обмеження для DataType, після чого створити екземпляр типу, використовуючи ініціалізатори обєкта Наступний код показує приклад інтерфейсу з однією властивістю:

interface IBase {

int Value { get set }

}

Обєднавши інтерфейс IBase і ключове слово new у вигляді обмежень, можна Нісан наступний код:

class Example&ltDataType&gt where DataType : IBase, new() {

DataType _value

public Example() {

_value = new DataType { Value = 10 }

}

}

У модифікованому прикладі жирним шрифтом виділено код, який створює екземпляр типу DataType, після чого використання обмежень дозволяє примение ініціалізатора обєкта, який визначає значення value

Обмеження class

Основним призначенням обмеження class є вказівка, чи є тип узагальнення NET звичайним або посилальним типом Далі наводиться приклад типу, який може працювати тільки зі посилальними типами:

class AssumeReferenceType&ltDataType&gt where DataType : class { DataType _value

public AssumeReferenceType(DataType value) {

}

}

Якби клас AssumeReferenceType був оголошений типу int, ТО КОД НЕ скомпілірался б У наступному коді наводиться приклад коду, яка не компілюється:

AssumeReferenceType&ltIExample&gt els = new AssumeReferenceType&ltIExample&gt(null)

Метою використання обмеження class є примус стандарту кодіранія, при якому тип буде підтримувати тільки посилальні типи

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*