Синтаксис интерфейса

Понятие интерфейса

 

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

Интерфейс представляет собой полностью абстрактный класс, все методы которого абстрактны.

От абстрактного класса интерфейс отличается некоторыми деталями в синтаксисе и поведении.

Синтаксическое отличие состоит в том, что методы интерфейса объявляются без указания модификатора доступа.

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

Важное отличие интерфейсного класса от обычного класса заключается в том, что он может наследовать несколько родительских интерфейсов. Таким образом, в С# разрешено множественное наследование, но только в интерфейсных классах.

Родительские интерфейсы перечисляются в списке за именем класса и двоеточием:

public interface INewClass: IInt1, IInt2, ..., IIntN

{ . . .}

Такого рода интерфейсные классы обязаны содержать реализации всех методов всех родительских интерфейсов.

Замечу, что интерфейсный класс может наследовать не только от интерфейсов, но и от одного (и только одного!) обычного класса, по отношению к которому он ведет себя как обычный наследник, то есть может переопределять его методы, добавлять поля и т. д.

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

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

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

Переименование методов. Если реализация одноименных методов должна быть различной, методы переименовываются.

Отметим еще одно важное назначение интерфейсов, отличающее их от абстрактных классов. Абстрактный класс представляет собой начальный этап проектирования класса, который в будущем получит конкретную реализацию. Интерфейсы задают дополнительные свойства классу. Каждый интерфейс наделяет класс тем или иным новым свойством.

 

Синтаксис интерфейса

 

Общее описание интерфейса, включающее необязательные элементы (они выделены квадратными скобками), имеет следующий формат записи:

 

[ атрибуты ] [ спецификаторы ] interface имя_класса [ : родители ]

{ тело_класса }где,

 

атрибуты – задают дополнительную информацию о классе;

спецификаторы – обычно определяют условие доступа к составляющим класса;

родители – родительские интерфейсные классы, которые наследует наш класс:

тело класса – определяет состав интерфейсного класса.

Если внимательно посмотреть на формат записи интерфейса, то можно заметить, что его формат очень похож на формат записи обычного класса. Это объясняется тем, что интерфейс – частный случай класса.

В библиотеке платформы .NET имеется большое число интерфейсов, наследуя которые, классы получают дополнительные свойства.

Например, интерфейс IComparable задает метод сравнения объектов по принципу больше или меньше, что позволяет выполнять их сортировку.

Реализация интерфейсов IEnumerable и IEnumerator дает возможность просматривать (перебирать) содержимое объекта с помощью конструкции foreach, а реализация интерфейса ICloneable — клонировать объекты.

Каждый интерфейс наделяет класс теми или иными новыми возможностями. В этом смысле поле для разработки новых интерфейсов практически бесконечно.

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

В качестве учебного примера опишем интерфейс, реализация методов которого позволит классу проводить некоторые преобразования над музыкальной записью – преобразуя 7 нот и паузу в цифры от 0 до 7 и выполнять обратные преобразования.

Как и любой учебный пример, он немного искусственный, поскольку наша главная задача сейчас состоит в том, чтобы рассмотреть технологию создания и использования интерфейсов.

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

 

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

interface ITextNoti

{

string Codirovanie();

string Decodirovanie();

}

 

class MyzikText: ITextNoti

{

string text;

static string[] codeTable =

{

"до", "ре", "ми", "фа", "соль", "ля", "си", "пауза"

};

 

//Конструктор

public MyzikText(string txt)

{

text = txt;

}

 

//Реализация интерфейсов

public string Codirovanie()

{

Boolean ok;

string rez = "";

string[] noti;

// преобразование к нижнему регистру

string text1 = text.ToLower();

//размерность массивов noti устанавливается

// автоматически в соответствии с размерностью массива,

//возвращаемого методом Split

noti = text1.Split(' ');

for (int i = 0; i < noti.Length; i++)

{

ok = false;

for (int j = 0; j < 8; j++)

if (noti[i] == codeTable[j])

{ ok = true; rez = rez + " " + j.ToString(); }

if (ok == false) rez = rez + " ?";

}

return rez;

}

// дешифровка поля text

// с использованием таблицы нот

public string Decodirovanie()

{

Boolean ok;

string rez = "";

string[] noti;

// преобразование к нижнему регистру

string text1 = text.ToLower();

noti = text1.Split(' ');

for (int i = 0; i < noti.Length; i++)

{

ok = false;

for (int j = 0; j < 8; j++)

if (Convert.ToInt32(noti[i]) == j)

{ ok = true; rez = rez + " " + codeTable[j]; }

if (ok == false) rez = rez + " ?";

}

return rez;

}

}

public Form1()

{

InitializeComponent();

}

 

private void button1_Click(object sender, EventArgs e)

{

string a,b;

a = textBox1.Text;

MyzikText IcxodText = new MyzikText(a);

b = IcxodText.Codirovanie();

textBox3.AppendText(b + "\r\n");

}

 

private void button2_Click(object sender, EventArgs e)

{

string a, b;

a = textBox2.Text;

MyzikText IcxodText1 = new MyzikText(a);

b = IcxodText1.Decodirovanie();

textBox3.AppendText(b + "\r\n");

}

}

}

 

Объявляем интерфейс ItextNoti, содержащий два метода – кодирование (словесный текст нот заменяется цифрами от 0 до 7) и декодирование (текст, представленный цифрами от 0 до 7, заменяется словесным текстом нот).

 

interface ITextNoti

{

string Codirovanie();

string Decodirovanie();

}

 

Далее объявляем интерфейсный класс, наследующий интерфейс и реализующий его методы. Выполняем общедоступную реализацию методов интерфейса. Алгоритм реализации интерфейсных методов прокомментирован в коде программы и не нуждается в дополнительных пояснениях.

Работа программы изображена на рисунке 11.1.

 

 

Рисунок 11.1 – Использование интерфейсного класса

 

В приведенном примере показана технология создания и использование интерфейса и интерфейсного класса.

 


<== предыдущая лекция | следующая лекция ==>
Разновидности гидроудара | 




Дата добавления: 2019-10-16; просмотров: 551;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.022 сек.