Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

6.6.1Определение интерфейса

Интерфейс (interface) объекта есть совокупность открытых функций, свойств, собьгтий или статических переменных, необходимых и достаточных для управления его функционированием пользователем объекта.

Заметим, что определение интерфейса в языках C++/CLI, C# и Java отличается.

////////////C++/CLI

Interface class имя-интерф [ : public имя-базов-интерф

[ , public имя-базов-интерф ] ... ]

{

объявление функций [, свойств и событий]

};

////////////C#

Interface имя-интерф [ : имя-базов-интерф [, имя-базов-интерф ] ... ]

{

объявление функций, свойств и событий

>

/////////////Java и J#

Interface имя-интерф [ extends имя-базов-интерф

[ , имя-базов-интерф ] ... ]

{

объявление функций и статических переменных

};

Для языков программирования C# и Java объявленные в интерфейсе функции, свойства и события считаются открытыми (public) по умолчанию и должны быть реализованы в классе, который наследует этот интерфейс. При отсутствии реализации наследуемого интерфейса компилятор сообщит об ошибке.

Заметим, что при наследовании классом интерфейса в языке Java применяется ключевое слово implements, а при наследовании интерфейсом интерфейса - слово extends.

Пример 6.6.1 иллюстрирует наследование (управляемого) интерфейса на языках C# и C++/CLI.

Пример 6.6.1. Наследование интерфейса вС# и C++/CLI.

///////////////

//C# File

using System;

Interface Ipe // Интерфейс, объявляющий свойство p и функцию Hallo

{

Int p {set; get;} //Объявить свойство

Void Hallo(); // Объявить функцию

}

class А: Ipe // Класс, наследующий интерфейс Ipe

{

private int x; // Переменная x, связанная со свойством P

public void Hallo() // Реализовать функцию Hallo интерфейса Ipe

{Console.WriteLine ("ПРИВЕТ");}

public int P // Реализовать свойство P интерфейса Ipe

{

set {x=value;} //Установить значение свойства Р

get {return x;} //Получить значение свойства Р

}

}

class Program

{

static void Main(string[] args)

{

А sA = new А(); // Создать объект

sA.P = 5; // Установить свойство P

Console.WriteLine("P= " + sA.P); // Выдать значение свойства P

sA.Hallo(); // Приветствовать

}

}

Результат:

P= 5

ПРИВЕТ

///////////////

// C++/CLI

#include "stdafx.h"

using namespace System;

interface class Ipe// Интерфейс, объявляющий свойство P и функцию Hallo.

{

property int P; // Объявить свойство P

void Hallo(); // Объявить функцию

};

ref class А: public Ipe // Класс, наследующий интерфейс Ipe

{

private:

int x; // Переменная x, связанная со свойством P

public:

virtual void Hallo()

{

Console::WriteLine("ПРИВЕТ"); // Реализовать ф-ю Hallo интерфейса Ipe

}

property int P // Реализовать свойство P

{

virtual void set(int param) {x= param;}

virtual int get() {return x;}

}

};

int main() // Главная статическая функция main()

{

А ^pA= gcnew А(); // Создать объект класса А

pA -> P= 5; // Установить свойство P

Console::WriteLine ("P= {0}", pA->P.ToString());

pA->Hallo(); // Приветствовать

Console::ReadKey();

return 0;

}

Результат:

P= 5

ПРИВЕТ

Программы примера 6.6.1 включают интерфейс Ipe, содержащий объявления функции Hallo() и свойство Р. О свойствах будет рассказано позднее.

Функция Main() или main() создаёт объект класса А и устанавливает его свойство P, равным 5. Затем значение свойства P выдаётся на консоль и вызывается функция Hallo().

Функция Hallo() и свойство P, объявленные в интерфейсе Ipe, обязательно должны быть реализованы в классе А, наследующим этот интерфейс. Попытка не реализовать хотя бы один элемент интерфейса приведёт к сообщению компилятора об ошибке.

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