Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тюмгу / Лекции КБ ИБАС 1 курс 2 семестр / лекция14 Безопасность 2018.pptx
Скачиваний:
14
Добавлен:
08.12.2019
Размер:
99.74 Кб
Скачать

Интерфейсы

В С# запрещено множественное наследование.

НО это ограничение компенсируется специальной конструкцией – интерфейсом.

Интерфейс - особый абстрактный класс, который может содержать только нестатические абстрактные функции-члены:

методы,

свойства,

индексаторы,

события.

Интерфейс при этом может наследовать другие (базовые для него) интерфейсы.

1

Объявление интерфейса и уточненное объявление класса

Синтаксис объявления интерфейса :

access interface intrf_name: Intr1, Intr2, …

{

met_type met_name (param_list);

prop_type prop_name

{

get;

set;

}

elem_type this [ind_type index]

{

get;

set;

}

event event_type event_name;

}

2

 

Уточненное определение класса:

access class class_name: base_class, intrf_name1,

intrf_name2, ...

{

// члены класса

}

Если в классе реализованы некоторые интерфейсы,

то их идентификаторы указываются в заголовке после наследуемого класса

Например:

class ClassA: BaseClass, Iface1, Iface2

{

// члены класса

}

3

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

Правила :

Класс не может выполнить частичную

реализацию наследуемого интерфейса.

Поэтому, определяя наследующий класс,

необходимо обеспечить реализацию всех членов наследуемых интерфейсов.

Методы, реализующие интерфейс, следует

объявлять с уровнем доступа public.

Причина : методы неявно общедоступны для

интерфейса, поэтому и реализации должны

иметь тот же уровень доступа.

Любая функция, которую класс реализует из интерфейса, может быть объявлена как virtual.

Тогда в наследующем классе ее можно

переопределить (override) или обеспечить новую реализацию (new).

4

Если класс реализует интерфейс, который наследует другой

интерфейс,

то должна обеспечиваться реализация для всех

членов, определенных в цепочке наследуемых интерфейсов.

Пример. Иллюстрация реализации интерфейса.

using System;

interface IPoint

{

// сигнатура свойств

int x

{

get;

set;

}

int y

{

get;

set;

}

}

5

 

class MyPoint : IPoint

{

//переменные экземпляра private int myX;

private int myY;

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

public MyPoint(int x, int y)

{

myX = x;

myY = y;

}

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

public int x

{

get

{

return myX;

}

set

{

myX = value;

}

}

6

public int y

{

get

{

return myY;

}

set

{

myY = value;

}

}

}

class MainClass

{

private static void PrintPoint (IPoint p)

{

Console.WriteLine("x={0}, y={1}", p.x, p.y);

}

public static void Main()

{

MyPoint p = new MyPoint(2,3);

Console.Write("My Point: ");

PrintPoint(p);

}

}

7

Явная реализация интерфейса

При реализации интерфейса указывается только имя реализуемой функции-члена.

Исключения

1. При множественном наследовании нескольких интерфейсов в них могут присутствовать функции с одинаковыми именами:

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

Надо использовать явную реализацию интерфейса - перед именем функции помещают имя интерфейса.

8

2. Явная реализация используется,

если реализуемую функцию нужно сделать

частной доступной только в данном классе и недоступной для объектов

(скрытие членов интерфейса).

Пример:

using System

interface IEven

{

//нечетное

bool isOdd (int x);

//четное

bool isEven (int x);

}

9

class MyClass : IEven

{

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

bool IEven.isOdd (int x)

{

if ((x%2) != 0) return true;

else return false;

}

//обычная реализация, использующая явную

public bool isEven (int x)

{

//ссылка на вызывающий объект

IEven iobj = this; return ! iobj.isOdd (x);

}

}

10