Интерфейсы

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

Определение интерфейса состоит из опционального множества атрибутов интерфейса, за которыми могут следовать опциональные модификаторы доступа 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("Пользовательская структура"1003.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;

См. также:

Руководство по языку Fore.NET