Extends
 
Указывает базовый тип, от которого наследуется новый тип

Синтаксис

Type typename Extends base_typename
...
End Type

Описание

Extends декларирует typename производный от base_typename. Производный тип typename, определенный пользователем, наследует поля и методы базового типа base_typename. typename объекты могут быть использованы вместо объектов base_typename. Поля и методы, унаследованные от base_typename будут неявно доступны как обычные элементы typename. Однако постоянный элемент будет затенять унаследованный элемент, если они имеют один и тот же идентификатор. Ключевое слово Base (доступ к элементу) может использоваться для доступа к элементам базового типа, явно.

Определяемые пользователем типы, расширяющие другой тип будут включать в себя базовый тип структуры в их начале, а их размер, который можно получить с помощью Sizeof()- это сумма размера базового типа + размер, необходимый для любых постоянных элементов. Поскольку унаследованные элементы знают, что структура не является пустой, производный тип не требует иметь постоянных элементов.

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

Расширение встроенного типа Object допускает использовать определяемый пользователем тип с Оператором Is для выполнения проверки run-time типа, для поддержки методов Virtual и Abstract, и использовать атрибут метода Override.

Примечание: Указатель производного определяемого пользователем типа может быть только для типов «совместимых» указателей (вверх/вниз по иерархии наследования) или Any Ptr. В противном случае, сначала нужно привести тип к Any Ptr.

Предупреждение: До версии fbc 0,24, пять ключевых слов, посвященных наследованию Extends, Base (доступ к элементу), Base (Инициализатор), Object и Оператор Is не поддерживались. Три новые ключевые слова Virtual, Abstract, и Override доступны начиная с версии компилятора 0.25 (прим: 0.25 - это промежуточная бета-версия между 0.24 и 0.90).

Пример

Type SchoolMember 'Представляет любой школьный элемент'
    Declare Constructor ()
    Declare Sub Init (ByRef _name As String, ByVal _age As Integer)
    As String Name
    As Integer age
End Type

Constructor SchoolMember ()
    Print "Initialized SchoolMember"
End Constructor

Sub SchoolMember.Init (ByRef _name As String, ByVal _age As Integer)
    This.name = _name
    This.age = _age
    Print "Name: "; This.name; "   Age:"; This.age
End Sub


Type Teacher Extends SchoolMember 'Представляет учителя, производного от SchoolMember'
    Declare Constructor (ByRef _name As String, ByVal _age As Integer, ByVal _salary As Integer)
    As Integer salary
    Declare Sub Tell ()
End Type

Constructor Teacher (ByRef _name As String, ByVal _age As Integer, ByVal _salary As Integer)
    Print "Initialized Teacher"
    This.Init(_name, _age) 'неявный доступ к базовому элементу процедуры'
    This.salary = _salary
End Constructor

Sub Teacher.Tell ()
    Print "Salary:"; This.salary
End Sub


Type Student Extends SchoolMember 'Представляет студента, производного от SchoolMember'
    Declare Constructor (ByRef _name As String, ByVal _age As Integer, ByVal _marks As Integer)
    As Integer marks
    Declare Sub Tell ()
End Type

Constructor Student (ByRef _name As String, ByVal _age As Integer, ByVal _marks As Integer)
    Print "Initialized Student"
    This.Init(_name, _age) 'неявный доступ к базовому элементу процедуры'
    This.marks = _marks
End Constructor
    
Sub Student.Tell ()
    Print "Marks:"; This.marks
End Sub


Dim As Teacher t = Teacher("Mrs. Shrividya", 40, 30000)
t.Tell()
Print
Dim As Student s = Student("Swaroop", 22, 75)
s.Tell()

' Пример с использованием всех восьми ключевых слов наследования:
'   'Extends', 'Base.', 'Base()', 'Object', 'Is' operator, 'Virtual', 'Abstract', 'Override'

Type root Extends Object ' 'Extends' для того чтобы активировать RTTI для наследования предопределенных типов объекта
  Declare Function ObjectHierarchy () As String
  Declare Abstract Function ObjectRealType () As String ' 'Abstract' объявляет функцию без локального тела
                                                        '    который должен быть переопределен
  Declare Virtual Destructor () ' 'Virtual' объявляет деструктор с телом ('Abstract' запрещено)
Protected:
  Declare Constructor () ' чтобы избежать пользовательского конструктора из root
  Declare Constructor (ByRef rhs As root) '' чтобы избежать пользовательского копирования конструкторов из root
End Type ' производный тип может не иметь элементов данных

Constructor root ()
End Constructor

Function root.ObjectHierarchy () As String
  Return "Object(forRTTI) <- root"
End Function

Virtual Destructor root ()
  Print "root destructor"
End Destructor


Type animal Extends root ' 'Extends' чтобы наследовать из root
  Declare Constructor (ByRef _name As String = "")
  Declare Function ObjectHierarchy () As String
  Declare Virtual Function ObjectRealType () As String Override ' 'Virtual' декларирует функцию с локальным телом
                                                                '    которая может быть переопределена
                                                                ' 'Override' чтобы проверить, если функция хорошо
                                                                '    переопределена
  Dim Name As String
  Declare virtual Destructor () Override ' 'Virtual' объявляет деструктор с локальным телом
                                         ' 'Override' чтобы проверить, если деструктор хорошо переопределен
End Type

Constructor animal (ByRef _name As String = "")
  This.name = _name
End Constructor

Function animal.ObjectHierarchy () As String
  Return Base.ObjectHierarchy & " <- animal" ' 'Base.' позволяет доступ к родительской функции-элементу
End Function

Virtual Function animal.ObjectRealType () As String
  Return "animal"
End Function

Virtual Destructor animal ()
  Print "  animal destructor: " & This.name
End Destructor


Type dog Extends animal ' 'Extends' наследует из animal
  Declare Constructor (ByRef _name As String = "")
  Declare Function ObjectHierarchy () As String
  Declare Function ObjectRealType () As String Override ' 'Override' чтобы проверить, если функция хорошо
                                                                '    переопределена

  Declare Destructor () Override ' 'Override' чтобы проверить, если деструктор хорошо переопределен
End Type производный тип может не иметь элементов данных

Constructor dog (ByRef _name As String = "")
  Base(_name) ' 'Base()' позволяет вызывать родительский конструктор
End Constructor

Function dog.ObjectHierarchy () As String
  Return Base.ObjectHierarchy & " <- dog" ' 'Base.' позволяет доступ к родительской функции-элементу
End Function

Function dog.ObjectRealType () As String
  Return "dog"
End Function

Destructor dog ()
  Print "    dog destructor: " & This.name
End Destructor


Type cat Extends animal ' 'Extends' наследует из animal
  Declare Constructor (ByRef _name As String = "")
  Declare Function ObjectHierarchy () As String
  Declare Function ObjectRealType () As String Override ' 'Override' чтобы проверить, если функция хорошо
                                                                '    переопределена

  Declare Destructor () Override ' 'Override' чтобы проверить, если деструктор хорошо переопределен
End Type производный тип может не иметь элементов данных

Constructor cat (ByRef _name As String = "")
  Base(_name) ' 'Base()' позволяет вызывать родительский конструктор
End Constructor

Function cat.ObjectHierarchy () As String
  Return Base.ObjectHierarchy & " <- cat" ' 'Base.' позволяет доступ к родительской функции-элементу
End Function

Function cat.ObjectRealType () As String
  Return "cat"
End Function

Destructor cat ()
  Print "    cat destructor: " & This.name
End Destructor


Sub PrintInfo (ByVal p As root Ptr) ' должна быть помещена после определения типа animal, типа dog и типа cat
  Print "  " & Cast(animal Ptr, p)->Name, "  " & p->ObjectRealType, "           ";
  If *p Is dog Then ' 'Is' позволяет проверить совместимость с символом типа
    Print  Cast(dog Ptr, p)->ObjectHierarchy
  ElseIf *p Is cat Then ' 'Is' позволяет проверить совместимость с символом типа
    Print Cast(cat Ptr, p)->ObjectHierarchy
  ElseIf *p Is animal Then ' 'Is' позволяет проверить совместимость с символом типа
    Print Cast(animal Ptr, p)->ObjectHierarchy
  End If
End Sub


Print "Name:", "Object (real):         Hierarchy:"
Dim a As root Ptr = New animal("Mouse")
PrintInfo(a)
Dim d As root Ptr = New dog("Buddy")
PrintInfo(d)
Dim c As root Ptr = New cat("Tiger")
Printinfo(c)
Print
Delete a
Delete d
Delete c

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

  • Нет в наличии в диалекте -lang qb , но есть псевдоним __Extends.

Отличия от QB

  • Новое в FreeBASIC

См. также