
- •Интерфейсы
- •Объявление интерфейса и уточненное объявление класса
- •Уточненное определение класса:
- •Реализация интерфейса
- •Если класс реализует интерфейс, который наследует другой
- •class MyPoint : IPoint
- •public int y
- •Явная реализация интерфейса
- •2. Явная реализация используется,
- •class MyClass : IEven
- •class Demo

Интерфейсы
В С# запрещено множественное наследование.
НО это ограничение компенсируется специальной конструкцией – интерфейсом.
Интерфейс - особый абстрактный класс, который может содержать только нестатические абстрактные функции-члены:
методы,
свойства,
индексаторы,
события.
Интерфейс при этом может наследовать другие (базовые для него) интерфейсы.
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