Abstract
 
Декларирует абстрактные методы

Синтаксис

Type typename Extends base_typename
End Type

Описание

Abstract - это особая форма Virtual. Разница заключается в том, что абстрактные методы не имеют тела, а только декларацию. По существу это позволяет объявление интерфейса который может осуществляться с помощью различных производных типов.

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

Конструкторы не могут быть абстрактными, так как они не могут быть виртуальными. Кроме того, абстрактные Деструкторы не поддерживаются, потому что тело деструктора (независимо от того, явно или неявно) необходимо для того, чтобы вызвать базовый и поле деструктора.

Абстракции называются "pure virtual" в C++ (в отличие от FreeBASIC, C++ позволяет "pure virtuals" иметь тело, но доступно только статически).

Примечание: В многоуровневом наследовании, одноименный метод (тот же идентификатор и сигнатура) может быть объявлен Abstract, Virtual или обычным (без спецификатора) на каждом уровне иерархии наследования. Когда происходит смешивание спецификаторов, обычный порядок абстрактный -> виртуальный -> обычный, сверху вниз в иерархии наследования.
Контроль доступа (Public/Protected/Private) переопределения метода не учитывается внутренним процессом полиморфизма, а учитывается только для первоначального вызова во время компиляции.
Производный статический метод не может переопределить базовый виртуальный / абстрактный метод, но может затенить(заменить) любой базовый метод (включая виртуальный\абстрактный).

Пример

Type Hello extends object
    Declare abstract Sub hi( )
End Type

Type HelloEnglish extends Hello
    Declare Sub hi( )
End Type

Type HelloFrench extends Hello
    Declare Sub hi( )
End Type

Type HelloGerman extends Hello
    Declare Sub hi( )
End Type


Sub HelloEnglish.hi( )
    Print "hello!"
End Sub

Sub HelloFrench.hi( )
    Print "Salut!"
End Sub

Sub HelloGerman.hi( )
    Print "Hallo!"
End Sub


    Randomize( Timer( ) )

    Dim As Hello Ptr h

    For i As Integer = 0 To 9
        Select Case( Int( Rnd( ) * 3 ) + 1 )
        Case 1
            h = New HelloFrench
        Case 2
            h = New HelloGerman
        Case Else
            h = New HelloEnglish
        End Select

        h->hi( )
        Delete h
    Next

Различия диалектов

  • Доступно только в диалекте -lang fb.

Отличия от QB

  • Новое в FreeBASIC

См. также