EXTENDS
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgExtends
- 最后更新: 2019-06-26
指定用于派生新类型的基类型
语法
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(派生用户自定义类型)中,仅当 typename 是 Union 时,字段才可以与 base_typename 共享同一块内存空间。这与 base_typename 是否为 Union 无关。
若只有 base_typename 是 Union,则它不受 typename(派生用户自定义类型)字段的影响。
由于 Union 不允许有复杂字段(即具有构造函数/析构函数的用户自定义类型,或动态字符串),因此派生的 Union 不允许包含复杂的 base_typename。
Base(初始化器) 关键字可在派生用户自定义类型的构造函数顶部使用,用于为基类型指定初始化器或构造函数调用。
扩展内置 Object 类型可使用户自定义类型与 Operator Is 配合使用以执行运行时类型检查,支持 Virtual 和 Abstract 方法,以及使用 Override 方法属性。
注意:UDT 指针只能被转换为"扩展兼容性"的指针类型(在继承层次中向上或向下),或转换为 Any Ptr。否则,需先转换为 Any Ptr(或若两种类型均直接或间接派生自 Object,则先转换为 Object Ptr)。
示例
start GeSHi
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
' 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 cend GeSHi
方言差异
- 在 -lang qb 方言中不可用,除非使用别名
__Extends引用。
与 QB 的区别
- FreeBASIC 新增
另请参阅
TypeUnionBase(初始化器)Base(成员访问)ObjectOperator IsVirtualAbstractOverrideExtends ZstringExtends Wstring
返回 目录