Интерфейс определяет контракт. Интерфейс сам по себе не предоставляет реализацию членов, в интерфейсах описывается сигнатура членов интерфейса. Класс или структура, реализующие интерфейс, должны соответствовать этому контракту и содержать реализацию всех членов, описанных в интерфейсе. Интерфейс может наследоваться от нескольких базовых интерфейсов, класс или структура могут реализовывать несколько интерфейсов.
Определение интерфейса состоит из опционального множества атрибутов интерфейса, за которыми могут следовать опциональные модификаторы доступа Public или Friend с последующим ключевым словом Interface и именем интерфейса. Далее через двоеточие могут быть указаны родительские интерфейсы. После этого следует тело интерфейса, завершаемое последовательностью ключевых слов End Interface.
Временами для ссылки на члены интерфейса используются их полностью квалифицированные имена. Полностью квалифицированное имя члена интерфейса состоит из имени интерфейса и имени члена, разделенных точкой. Если интерфейс является частью пространства имён полностью квалифицированное имя членов интерфейса включает имя пространства имён. Модификаторы доступа для таких членов не указываются. Также в определениях таких членов нельзя использовать модификаторы Abstract, Virtual, Override и Shared.
В теле интерфейса может быть описана сигнатура следующих членов:
Ниже приведены различные примеры описания и реализации интерфейсов.
Interface IUserInterface
Sub Test1();
Sub Test2();
End Interface;
Abstract Class BaseAbstractClass: IUserInterface
Public Sub Test1();
Begin
//Реализация метода интерфейса
End Sub;
Public Sub Test2();
Begin
//Реализация метода интерфейса
Test3();
End Sub;
Abstract Public Sub Test3();
End Class;
Class UserObject: BaseAbstractClass
Public Override Sub Test3();
Begin
//Реализация абстрактного метода
End Sub;
End Class;
Sub Test();
Var
Obj: UserObject = New UserObject();
Begin
Obj.Test1(); //Вызов метода, реализованного в абстрактном классе
Obj.Test2(); //Вызов метода, реализованного в абстрактном классе
Obj.Test3(); //Вызов абстрактного метода, реализованного в классе UserObject
End Sub;
Interface IUserStruct
Property Title: string
Get;
Set;
End Property;
End Interface;
Struct UserStructure: IUserStruct
s: string;
Public Param1: integer;
Public Param2: double;
Public Property Title: string
Get
Begin
Return s;
End Get
Set
Begin
s := Value
End Set
End Property;
Public Constructor Create(Title: string; Param1Value: integer; Param2Value: double);
Begin
s := Title;
Param1 := Param1Value;
Param2 := Param2Value;
End Constructor;
End Struct;
Sub Test();
Var
StructObj: UserStructure;
Begin
StructObj := New UserStructure("Пользовательская структура", 100, 3.14);
End Sub;
Interface IUserInterface1
Sub Test1();
Sub Test2();
End Interface;
Interface IUserInterface2
Sub Test2();
End Interface;
//Реализация интерфейсов
Class BaseClass: IUserInterface1, IUserInterface2
Public Sub Test1();
Begin
End Sub;
//Общий метод для двух интерфейсов
Public Sub Test2();
Begin
End Sub;
End Class;
//Повторная реализация интерфейса IUserInterface1
Class ChildClass: BaseClass, IUserInterface2
//Явная реализация метода IUserInterface2.Test2
Sub IUserInterface2.Test2();
Begin
End Sub;
End Class;
Sub Test();
Var
Obj: BaseClass = New BaseClass();
Obj1: ChildClass = New ChildClass();
Begin
Obj.Test1(); //Вызов метода BaseClass.Test1
(Obj As IUserInterface1).Test2(); //Вызов метода BaseClass.Test2
(Obj As IUserInterface2).Test2(); //Вызов метода BaseClass.Test2
Obj1.Test1(); //Вызов метода BaseClass.Test1
Obj1.Test2(); //Вызов метода BaseClass.Test2
(Obj1 As IUserInterface2).Test2(); //Вызов метода ChildClass.Test2
End Sub;
См. также: