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
См. также