русс | укр

C# - Головна
Контакти
Задайте питання...
Перегляд всіх питань


Простір імен
  ► System (5)
  ► Microsoft (1)


Для учнів (початківців)
  ► Відео уроки (4)
  ► Навчання (177)
  ► Приклади програм (19)
  ► Секрети Сі Шарп (4)

Для професіоналів
  ► Навчання (6)
  ► Приклади програм (1)










Реалізація інтерфейсів

Отже, якщо інтерфейс визначено, один чи кілька класів можуть його реалізувати. Щоб реалізувати інтерфейс, потрібно вказати його ім'я після імені класу подібно до того, як при створенні похідного вказується базовий клас. Формат запису класу, який реалізує інтерфейс, такий:

class имя_класса : interface name { // тіло класу

}

Неважко здогадатися, що ім'я реалізованого інтерфейсу задається з допомогою елемента interface name.

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

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

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

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

// Реалізація інтерфейсу ISeries, class ByTwos : ISeries {

int start;

int val;

public ByTwos() { start = 0; val = 0;

}

public int getNext() {

val +=2; return val;

}

public void reset() { val = start;

}

public void setStart(int x) { start = x; val = start;

}

}

Як бачите, клас ByTwos реалізує всі три методи, визначені інтерфейсом ISeries. Інакше і бути не може, оскільки класу не дозволяється створювати часткову реалізацію інтерфейсу.

Розглянемо приклад, що демонструє використання класу ByTwos, Ось його код:

// Демонстрація використання інтерфейсу,

// реалізованого класом ByTwos.

using System;

class SeriesDemo (

public static void MainO { ByTwos ob = new ByTwos();

for(int i=0; i < 5; i++)

Console.WriteLine("Таке значення одно " + ob.getNext() ) ;

Console.WriteLine("\пПереход в початковий стан."); ob.reset();

for(int i-0; i < 5; i++)

Console.WriteLine("Таке значення одно " +

Iob.getNext()) ; Console.WriteLine("\n Починаємо з числа 100."); ob.setStart(100); for(int i=0; i < 5; 1++)

Console.WriteLine("Таке значення одно " +" ob.getNext());

}

}

Щоб скомпілювати програму SeriesDemo, необхідно включити в процес компіляції файли, які містять класи ISeries, ByTwos і SeriesDemo. Для створення виконуваної програми компілятор автоматично скомпилирует всі три файли. Якщо ці файли називаються, наприклад, ISeries, cs, ByTwos. cs і SeriesDemo.es, то програма відбудеться створення допомогою виконання такої командного рядка:

>csc SeriesDemo.cs ISeries.cs ByTwos.cs

Якщо ви використовуєте інтегровану середу (IDE) Visual Studio, додайте всі ці три файли в свій#-проект. Цілком припустимо також помістити їх в один файл.

У класах, які реалізують інтерфейси, можна визначати додаткові члени. Наприклад, представлену нижче версію класу ByTwos доданий метод getPrevious (), який повертає попереднє значення ряду.

// Реалізація інтерфейсу ISeries з додатково // визначаються методом getPrevious().

class ByTwos : ISeries {

int start;

int val;

int prev;

public ByTwos() {

start = 0;

val = 0;

prev = -2;

}

public int getNext(){

prev = val;

val +- 2;

return val;

}

public void reset() {

val = start;

prev = start - 2;

)

public void setStart(int x) { start = x; val - start;

Iprev = val - 2; // Метод, не оголошений в інтерфейсі ISeries. public int getPrevious<) { return prev;

Зверніть увагу на те, що додавання методу getPrevious () зажадало внесення змін у реалізацію методів, визначених інтерфейсом iSeries. Але оскільки інтерфейс для цих методів залишається незмінною при зміні не руйнується код, написаний раніше. В цьому і полягає одна з переваг використання інтерфейсів.

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

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

// Демонстрація використання інтерфейсних посилань.

using System;

// Визначення інтерфейсу, public interface ISeries {

int getNextO; // Повертає наступне число ряду.

void reset; // Виконує перезапуск.

void setStart(int x); // Встановлює початкову

// значення.

}

// Використовуємо інтерфейс ISeries для генерування // послідовності парних чисел, class ByTwos : ISeries {

int start;

int val;

public ByTwosО {

start = 0; val = 0;

}

public int getWext{) {

val +=2; return val;

}

public void reset{) {

val = start;

}

public void setStart(int x) {

start = x; val = start;

}

}

// Використовуємо інтерфейс ISeries для побудови

// ряду простих чисел,

class Простих чисел : ISeries {

int start;

int val;

public Простих чисел() {

start = 2; val = 2;

}

public int getNext() { int I, j; bool isprime;

val++;

for(i - val; i < 1000000; i++) { isprime = true;

for(j - 2; j < (i/j + 1); {

if<(i%j)--0) { isprime = false; break;

}

}

if(isprime) {

val = i; break;

}

}

return val;

}

public void reset() {

val = start;

}

public void setStart(int x) {

start = x;

val = start;

)

}

class SeriesDemo2 {

public static void Main() {

ByTwos twoOb - new ByTwos();

Простих primeOb = new Простих чисел();

ISeries ob;

for(int i=0; i < 5; i++) {

ob = twoOb; Console.WriteLine(

"Таке парне число дорівнює

ob.getNext()) ; ob = primeOb; Console.WriteLine(

"Наступне просте число дорівнює

ob.getNext());

Ось результати виконання цієї програми:

(Наступне парне число дорівнює 2

Наступне просте число дорівнює 3

Таке парне число дорівнює А

Наступне просте число дорівнює 5

Таке парне число дорівнює 6

Наступне просте число дорівнює 7

Таке парне число дорівнює 8

Наступне просте число дорівнює 11

Таке парне число дорівнює 10

Наступне просте число дорівнює 13

У методі Main() оголошується змінна ob як посилання на інтерфейс iSeries. Це означає, що її можна використовувати для зберігання посилань на будь-який об'єкт, який реалізує інтерфейс ISeries. В даному випадку вона служить для посилання на об'єкти twoOb і primeOb, які є екземплярами класів ByTwos і Простих, відповідно, причому обидва класи реалізують один і той же інтерфейс, ISeries.

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

 

Переглядів: 2981






© 2012 ci-sharp.ru При використанні матеріалу пряме iндексуюче посилання на сайт ОБОВ'ЯЗКОВЕ.
Права строго захищені нормами міжнародного права, інтелектуальної власності та авторського права.