Skip to content

EXTENDS


指定用于派生新类型的基类型

语法

vb
Type|Union typename Extends base_typename

...

End Type|Union

说明

Extends 声明 typename 派生自 base_typename。派生用户自定义类型 typename 继承基类型 base_typename 的字段和方法。typename 对象可以替代 base_typename 对象使用。从 base_typename 继承的字段和方法可以像 typename 自身的成员一样隐式访问。

但是,如果本地成员与继承成员具有相同的标识符,则本地成员会遮蔽继承成员。可以使用 Base(成员访问) 关键字来显式访问被本地成员遮蔽的基类型成员。

扩展另一个类型的用户自定义类型会将基类型结构包含在其起始位置,sizeof() 报告的大小是基类型大小与常规数据字段(非静态数据字段)所需大小之和。由于继承的成员确保结构不为空,派生类型不必拥有自己的常规数据字段。

typename(派生用户自定义类型)中,仅当 typenameUnion 时,字段才可以与 base_typename 共享同一块内存空间。这与 base_typename 是否为 Union 无关。

若只有 base_typenameUnion,则它不受 typename(派生用户自定义类型)字段的影响。

由于 Union 不允许有复杂字段(即具有构造函数/析构函数的用户自定义类型,或动态字符串),因此派生的 Union 不允许包含复杂的 base_typename

Base(初始化器) 关键字可在派生用户自定义类型的构造函数顶部使用,用于为基类型指定初始化器或构造函数调用。

扩展内置 Object 类型可使用户自定义类型与 Operator Is 配合使用以执行运行时类型检查,支持 VirtualAbstract 方法,以及使用 Override 方法属性。

注意:UDT 指针只能被转换为"扩展兼容性"的指针类型(在继承层次中向上或向下),或转换为 Any Ptr。否则,需先转换为 Any Ptr(或若两种类型均直接或间接派生自 Object,则先转换为 Object Ptr)。

示例

start GeSHi

vb
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 "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 '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 "Initialized Teacher"
    This.Init(_name, _age) 'implicit access to base member procedure'
    This.salary = _salary
End Constructor

Sub Teacher.Tell ()
    Print "Salary:"; 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 "Initialized Student"
    This.Init(_name, _age) 'implicit access to base member procedure'
    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()

end GeSHi

start GeSHi

vb
' Example using all eight keywords of inheritance:
'   'Extends', 'Base.', 'Base()', 'Object', 'Is' operator, 'Virtual', 'Abstract', 'Override'

Type root Extends Object ' 'Extends' to activate RTTI by inheritance of predefined Object type
  Declare Function ObjectHierarchy () As String
  Declare Abstract Function ObjectRealType () As String ' 'Abstract' declares function without local body
                                                        '    which must be overriden
  Dim Name As String
  Declare Virtual Destructor () ' 'Virtual' declares destructor with body ('Abstract' forbidden)
Protected:
  Declare Constructor () ' to avoid user construction from root
  Declare Constructor (ByRef rhs As root) '' to avoid user copy-construction from root
End Type ' derived type may be member data empty

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' to inherit of root
  Declare Constructor (ByRef _name As String = "")
  Declare Function ObjectHierarchy () As String
  Declare Virtual Function ObjectRealType () As String Override ' 'Virtual' declares function with local
                                                                '    body which can be overriden
                                                                ' 'Override' to check if the function is
                                                                '    well an override
  Declare virtual Destructor () Override ' 'Virtual' declares destructor with local body
                                         ' 'Override' to check if the destructor is well an override
End Type

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

Function animal.ObjectHierarchy () As String
  Return Base.ObjectHierarchy & " <- animal" ' 'Base.' allows to access to parent member function
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' to inherit of animal
  Declare Constructor (ByRef _name As String = "")
  Declare Function ObjectHierarchy () As String
  Declare Function ObjectRealType () As String Override ' 'Override' to check if the function is well an
                                                        '    override
  Declare Destructor () Override ' 'Override' to check if the destructor is well an override
End Type ' derived type may be member data empty

Constructor dog (ByRef _name As String = "")
  Base(_name) ' 'Base()' allows to call parent constructor
End Constructor

Function dog.ObjectHierarchy () As String
  Return Base.ObjectHierarchy & " <- dog" ' 'Base.' allows to access to parent member function
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' to inherit of animal
  Declare Constructor (ByRef _name As String = "")
  Declare Function ObjectHierarchy () As String
  Declare Function ObjectRealType () As String Override ' 'Override' to check if the function is well an
                                                        '    override
  Declare Destructor () Override ' 'Override' to check if the destructor is well an override
End Type ' derived type may be member data empty

Constructor cat (ByRef _name As String = "")
  Base(_name) ' 'Base()' allows to call parent constructor
End Constructor

Function cat.ObjectHierarchy () As String
  Return Base.ObjectHierarchy & " <- cat" ' 'Base.' allows to access to parent member function
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) ' must be put after definition of animal type, dog type and cat type
  Print "  " & p->Name, "  " & p->ObjectRealType, "           ";
  If *p Is dog Then ' 'Is' allows to check compatibility with type symbol
    Print  Cast(dog Ptr, p)->ObjectHierarchy
  ElseIf *p Is cat Then ' 'Is' allows to check compatibility with type symbol
    Print Cast(cat Ptr, p)->ObjectHierarchy
  ElseIf *p Is animal Then ' 'Is' allows to check compatibility with type symbol
    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

end GeSHi

方言差异

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

与 QB 的区别

  • FreeBASIC 新增

另请参阅

  • Type
  • Union
  • Base(初始化器)
  • Base(成员访问)
  • Object
  • Operator Is
  • Virtual
  • Abstract
  • Override
  • Extends Zstring
  • Extends Wstring

返回 目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系