русс | укр

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

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


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


Створення класу-прототипу


Дата додавання: 2015-01-08; переглядів: 964.


 

Мова C# дозволяє створювати власні класи-прототипи і їх різновиди - інтерфейси, структури, делегати і події, а також узагальнені (generic) методи звичайних класів.

Розглянемо створення класу-прототипу на прикладі стека, приведеному в специфікації С#. Параметр типу даних, які зберігаються в стеку, указується в кутових дужках після імені класу, а потім використовується таким же чином, як і звичайні типи:

public class Stack<T>

{

Т[] items:

int count;

public void Push(T item ){...} // переміщення в стек

public T Pop() { ... } // витягання із стека

}

При використанні цього класу на місце параметра Т підставляється реальний тип, наприклад int:

 

Stack<int> stack = new Stack<int>();

stack.Push( 3 ) ;

int x = stack.Pop();

 

Тип Stack<int> називається сконструйованим типом (constructed type). Цей тип створюється під час виконання програми при його першій згадці в програмі. Якщо в програмі зустрінеться клас Stack з іншим значущим типом, наприклад doublе, середовище виконання створить іншу копію коду для цього типу. Навпаки, для всіх посилальних типів буде використана одна і та ж копія коду, оскільки робота з покажчиками на різні типи виконується однаковим чином. Клас-прототип може містити довільну кількість параметрів типу. Для кожного з них можуть бути задані обмеження (constraints), вказуючи, яким вимогам повинен задовольняти аргумент, відповідний цьому параметру, наприклад, може бути вказано, що це має бути значущий тип або тип, який реалізує деякий інтерфейс.

Синтаксично обмеження задаються після ключового слова where, наприклад:

public class Stack<T>

where T : struct

{ ... }

Тут за допомогою слова struct записано обмеження, що елементи стека мають бути значущого типу. Для посилального типу вживається ключове слово class. Для кожного типу, класу, що є параметром, може бути задано один рядок обмежень, який може включати один клас, а за ним - довільна кількість інтерфейсів, що перераховуються через кому.

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

Окрім класу і інтерфейсів в обмеженнях можна задати вимогу, щоб тип-аргумент мав конструктор за умовчанням без параметрів, що дозволяє створювати об'єкти цього типу в тілі методів класу-прототипу. Ця вимога записується у вигляді виразу new(), наприклад:

 

public class EntityTable<К, Е>

where К: IComparable<K>, IPersistable

where E: Entity. new()

{

public void Add( К key. E entity )

{

if ( key.CompareTo( x ) < 0 ) { ... }

}

}

В даному прикладі на перший аргумент класу Entitytable накладаються два обмеження по інтерфейсах, а для другого аргументу задано, що він може бути тільки класом Entity або його нащадком і мати конструктор без параметрів.

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

Для завдання типізованим елементам класу-прототипу значень за умовчанням використовується ключове слово default. При цьому елементам посилального типу привласнюється null, а елементам значущого типу - 0.

 


<== попередня лекція | наступна лекція ==>
Класи-прототипи | Узагальнені методи


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