ABSTRACT
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgAbstract
- 最后更新: 2019-06-26
声明抽象方法
语法
vb
Type typename Extends base_typename
Declare Abstract Sub|Function|Property|Operator ...
End Type说明
Abstract 是 Virtual 的一种特殊形式。区别在于抽象方法没有方法体,只有声明。这实际上允许声明一个接口,可由各种派生类型来实现。
要调用抽象方法,必须已由派生数据类型重写并实现该方法,否则程序将中止。
因此,只有实现了所有抽象方法的类型才允许创建对象。同样的原因,构造函数不应调用未实现的方法。
构造函数 不能是抽象的,因为它们不能是虚拟的。此外,也不支持抽象析构函数,因为需要析构函数体(无论是隐式还是显式)来调用基类和字段的析构函数。
抽象方法在 C++ 中称为"纯虚函数"(与 FreeBASIC 不同,C++ 允许纯虚函数拥有方法体,但只能静态访问)。
注意:在多层继承中,同名方法(相同标识符和签名)可以在每个继承层次中分别声明为 Abstract、Virtual 或普通方法(不带修饰符)。当混用修饰符时,通常的顺序是从上到下:abstract -> virtual -> normal。
重写方法的访问控制(Public/Protected/Private)不会被内部多态过程考虑,仅在编译时的初始调用中起作用。
派生的静态方法不能重写基类的虚拟/抽象方法,但可以遮蔽任何基类方法(包括虚拟/抽象方法)。
示例
start GeSHi
vb
Type Hello extends object
Declare abstract Sub hi( )
End Type
Type HelloEnglish extends Hello
Declare Sub hi( )
End Type
Type HelloFrench extends Hello
Declare Sub hi( )
End Type
Type HelloGerman extends Hello
Declare Sub hi( )
End Type
Sub HelloEnglish.hi( )
Print "hello!"
End Sub
Sub HelloFrench.hi( )
Print "Salut!"
End Sub
Sub HelloGerman.hi( )
Print "Hallo!"
End Sub
Randomize( Timer( ) )
Dim As Hello Ptr h
For i As Integer = 0 To 9
Select Case( Int( Rnd( ) * 3 ) + 1 )
Case 1
h = New HelloFrench
Case 2
h = New HelloGerman
Case Else
h = New HelloEnglish
End Select
h->hi( )
Delete h
Nextend GeSHi
方言差异
- 仅在 -lang fb 方言中可用。
与 QB 的差异
- FreeBASIC 新增特性
另请参阅
VirtualTypeExtendsExtends ZstringExtends WstringObjectOverride
返回 目录