Abstract

Declare abstract methods

Syntax
   Type typename Extends base_typename
      Declare Abstract Sub|Function|Property|Operator ...
   End Type

Description
   Abstract is a special form of Virtual. The difference is that abstract 
   methods do not have a body, but just the declaration. Essentially this 
   allows the declaration of an interface which can be implemented by 
   various derived types.

   In order to call an abstract method, it must have been overridden and 
   implemented by a derived data type, or else the program will abort.
   As a result, only types that implement all the abstract methods are 
   allowed to create objects. For the same reason, a constructor should not 
   call an unimplemented method.

   Constructors cannot be abstract, since they cannot be virtual. In 
   addition, abstract Destructors are not supported either, because a 
   destructor body (no matter whether implicit or explicit) is needed in 
   order to call base and field destructors.

   Abstracts are called "pure virtual" in C++ (unlike FreeBASIC, C++ allows 
   pure virtuals to have a body, but accessible only statically).

   Note: In a multi-level inheritance, a same named method (same identifier 
   and signature) can be declared Abstract, Virtual or normal (without 
   specifier) at each inheritance hierarchy level. When there is mixing of 
   specifiers, the usual order is abstract -> virtual -> normal, from top 
   to bottom of the inheritance hierarchy.
   The access control (Public/Protected/Private) of an overriding method is 
   not taken into account by the internal polymorphism process, but only 
   for the initial call at compile-time.
   A derived static method cannot override a base virtual/abstract method, 
   but can shadow any base method (including virtual/abstract).

Example
   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

Dialect Differences
   * Only available in the -lang fb dialect.

Differences from QB
   * New to FreeBASIC

See also
   * Virtual
   * Type
   * Extends
   * Extends Zstring
   * Extends Wstring
   * Object
   * Override

