Extends
 
声明子类继承自某个基类。

语法

Type|Union typename Extends base_typename
...
End Type|Union

说明

Extends声明typename base_typename 派生。派生的用户定义类型typename 继承base_typename 基本类型的字段和方法。typename 对象可以用来代替base_typename 对象。从base_typename 继承的字段和方法将像typename 的常规成员隐式访问。
但是,如果常规成员具有相同的标识符,则会影响继承的成员。Base (成员访问)关键字可用于显式访问由本地成员隐藏的基本类型的成员。

扩展其他类型的用户定义类型将包括其开头的基本类型结构,并且由Sizeof()报告的大小是其基本类型的大小加上任何常规成员所需的大小的总和。由于继承的成员确保结构不为空,因此派生类型不需要具有自己的常规成员。

Base (初始值设定)关键字可以在派生用户定义类型的构造函数的顶部使用。它允许为基类型指定初始化程序或构造函数调用。

扩展内置Object类型允许与操作符 Is一起使用用户定义的类型来执行运行时类型检查,以支持VirtualAbstract方法,并使用Override方法属性。

注意:派生的UDT指针只能转换为“兼容”指针类型(上/下继承层次结构)或Any Ptr.否则,首先转换为Any Ptr.

警告:在fbc版本0.24之前,不支持这5个致力于继承的关键字ExtendsBase (成员访问)Base (初始值设定)Object操作符 Is.三个新的关键字VirtualAbstractOverride附有fbc版本0.90。

例子

Type SchoolMember 'Represents any school member'
    Declare Constructor ()
    Declare Sub Init (ByRef _name As String, ByVal _age As Integer)
    As String Name
    As Integer age
End Type

Constructor SchoolMember ()
    Print "初始化学校成员"
End Constructor

Sub SchoolMember.Init (ByRef _name As String, ByVal _age As Integer)
    This.name = _name
    This.age = _age
    Print "名称:"; This.name; "年龄:"; This.age
End Sub


Type Teacher Extends SchoolMember 'Represents a teacher derived from 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 "初始化教师"
    This.Init(_name, _age) 'implicit access to base member procedure'
    This.salary = _salary
End Constructor

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


Type Student Extends SchoolMember 'Represents a student derived from 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 "初始化学生"
    This.Init(_name, _age) 'implicit access to base member procedure'
    This.marks = _marks
End Constructor
    
Sub Student.Tell ()
    Print "分数:"; This.marks
End Sub


Dim As Teacher t = Teacher("MRSK斯里韦德亚", 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'通过继承预定义的Object类型激活RTTI
  Declare Function ObjectHierarchy () As String
  Declare Abstract Function ObjectRealType () As String ' 'Abstract'声明没有本机的功能
                                                        '这必须被覆盖
  Dim Name As String
  Declare Virtual Destructor () ' 'Virtual' declares destructor with body ('Abstract'禁止)
Protected:
  Declare Constructor () '以避免用户从根建立
  Declare Constructor (ByRef rhs As root) ''以避免用户从根目录复制
End Type '派生类型可能是成员数据为空

Constructor root ()
End Constructor

Function root.ObjectHierarchy () As String
  Return "对象(forRTTI)< - 根"
End Function

Virtual Destructor root ()
  Print "根析构函数"
End Destructor


Type animal Extends root ' 'Extends'继承根
  Declare Constructor (ByRef _name As String = "")
  Declare Function ObjectHierarchy () As String
  Declare Virtual Function ObjectRealType () As String Override ' 'Virtual'用本地声明函数
                                                                '身体可以被覆盖
                                                                ' 'Override'检查功能是否正确
                                                                '好超越
  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 & "< - 动物" ' 'Base.'允许访问父成员函数
End Function

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

Virtual Destructor animal ()
  Print "动物破坏者:" & This.name
End Destructor


Type dog Extends animal ' 'Extends'继承动物
  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 & " - 狗" ' 'Base.'允许访问父成员函数
End Function

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

Destructor dog ()
  Print "狗破坏者:" & This.name
End Destructor


Type cat Extends animal ' 'Extends'继承动物
  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 & "< - 猫" ' 'Base.'允许访问父成员函数
End Function

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

Destructor cat ()
  Print "猫破坏者:" & This.name
End Destructor


Sub PrintInfo (ByVal p As root Ptr) '必须放在动物类型,狗型和猫型之间
  Print "" & 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 "名称:", "对象(实际):层次结构:"
Dim a As root Ptr = New animal("老鼠")
PrintInfo(a)
Dim d As root Ptr = New dog("伙伴")
PrintInfo(d)
Dim c As root Ptr = New cat("虎")
Printinfo(c)
Print
Delete a
Delete d
Delete c

方言差异

  • -lang qb 方言中不可用,除非使用别名__Extends引用。

与QB差别

  • 新的FreeBASIC

参考