русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Шаблони класів на мові програмування С#.


Дата додавання: 2014-10-07; переглядів: 923.


 

Універсальні класи інкапсулюють операції, що не відносяться до якогось певного типу даних. Найчастіше універсальні класи використовуються з колекціями, такими як зв'язані списки, хеш-таблиці, черги, стеки, дерева і т.п. Такі операції як додавання елементів в колекцію або їх видалення здійснюються однаково незалежно від типу збережених даних. Для більшої частини сценаріїв, в яких потрібні класи колекцій, рекомендується використовувати класи, що входять до бібліотеки класів платформи. NET Framework. Додаткові відомості про використання цих класів див Як правило, створення універсальних класів починається з запуску існуючого класу і зміни типів на параметри типів по одному доти, поки не буде досягнуто оптимальне співвідношення між універсальністю і зручністю. При створенні власних універсальних класів слід враховувати наступне:

• Які типи перетворювати в параметри.

Як правило, чим більше типів перетворено в параметри, тим більш гнучким стає програмний код. Однак, зайве узагальнення може зробити код складним для розуміння іншим розробникам.

• Які обмеження застосовуються до параметрів типів

• Рекомендується застосовувати найбільше можливе число обмежень, при якому забезпечується обробка потрібних типів. Наприклад, якщо відомо, що універсальних клас потрібен тільки для посилальних типів, можна застосувати обмеження класу. Це запобіжить використання класу з типами значень і дозволить використовувати оператор as для T і перевіряти нульові значення.

• Чи слід розділяти поведінку універсального класу на базові класи і підкласи.

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

• Чи слід реалізовувати один або кілька універсальних інтерфейсів.

Наприклад, при створенні класу, який буде використаний для створення елементів в універсальній колекції, може знадобитися реалізувати інтерфейс, подібний IComparable <T>, де T - тип вашого класу.

У правилах, що діють для параметрів типів і обмежень, діє кілька неявних принципів поведінки універсальних класів, особливо щодо успадкування та доступу до членів. Перед тим, як продовжити, слід усвідомити деякі моменти. Для універсального класу Node <T>, клієнтський код може посилатися на клас шляхом зазначення аргументу типу, щоб створити закритий тип (Node <int>). Також можна не вказувати параметр типу, щоб створити відкритий тип (Node <T>). Універсальні класи можуть бути успадковані від конкретних закритих або відкритих базових класів.

C#

class BaseNode { }class BaseNodeGeneric<T> { } // concrete typeclass NodeConcrete<T> : BaseNode { } //closed constructed typeclass NodeClosed<T> : BaseNodeGeneric<int> { } //open constructed type class NodeOpen<T> : BaseNodeGeneric<T> { }

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

C#

//No errorclass Node1 : BaseNodeGeneric<int> { } //Generates an error//class Node2 : BaseNodeGeneric<T> {} //Generates an error//class Node3 : T {}

Універсальні класи, успадковані від відкритих базових класів, повинні надавати аргументи типу для всіх параметрів типу базового класу, до яких немає доступу у посяде класу, як показано в наступному прикладі коду.

 

C#

class BaseNodeMultiple<T, U> { } //No errorclass Node4<T> : BaseNodeMultiple<T, int> { } //No errorclass Node5<T, U> : BaseNodeMultiple<T, U> { } //Generates an error//class Node6<T> : BaseNodeMultiple<T, U> {}

Універсальні класи, успадковані від відкритих базових класів, повинні вказувати обмеження, які відповідають обмеженням базового типу або є більш строгими.C#

class NodeItem<T> where T : System.IComparable<T>, new() { }class SpecialNodeItem<T> : NodeItem<T> where T : System.IComparable<T>, new() { }

Універсальні типи можуть використовувати декілька параметрів типу і обмежень.C#

class SuperKeyType<K, V, U> where U : System.IComparable<U> where V : new(){ }

Відкриті та закриті типи можна використовувати в якості параметрів методів.C#

void Swap<T>(List<T> list1, List<T> list2){ //code to swap items} void Swap(List<int> list1, List<int> list2){ //code to swap items}

Якщо універсальних клас реалізує інтерфейс, всі екземпляри цього класу можуть бути приведені до цього інтерфейсу.

Універсальні класи інваріантні. Іншими словами, якщо вхідний параметр вказує List <BaseClass>, при спробі надати List <DerivedClass> виникне помилка компіляції.

 


<== попередня лекція | наступна лекція ==>
Використання шаблонів форм із депозитарію | Приклади шаблонів (класів шаблонів).


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн