FreeBasic Abstract 关键字
最后修改日期:2025 年 6 月 16 日
FreeBasic 的 Abstract
关键字用于创建不能直接实例化的抽象类和抽象方法。抽象类用作继承层次结构的基础类。
基本定义
在 FreeBasic 中,Abstract
标记的类或方法必须由派生类实现。抽象类不能直接实例化,而是为了继承而设计的。
抽象方法在基类中没有实现。派生类必须为所有抽象方法提供具体的实现。这实现了多态性并强制执行了一致的接口。
简单的抽象类
此示例演示了抽象类的基本结构。
Type Animal Abstract Declare Abstract Sub MakeSound() End Type Type Dog Extends Animal Declare Sub MakeSound() Print "Woof!" End Sub End Type Dim As Dog Ptr myDog = New Dog myDog->MakeSound() Delete myDog
这里我们定义了一个带有单个抽象方法的抽象 Animal
类。Dog
类继承自 Animal
并实现了 MakeSound
方法。我们不能创建 Animal
的实例。
带具体方法的抽象类
抽象类可以包含抽象方法和已实现的方法。
Type Shape Abstract Declare Abstract Function Area() As Single Declare Sub Display() Print "This is a shape" End Sub End Type Type Circle Extends Shape radius As Single Declare Function Area() As Single Return 3.14159 * radius * radius End Sub End Type Dim As Circle Ptr c = New Circle c->radius = 5 c->Display() Print "Area: "; c->Area() Delete c
Shape
类有一个抽象方法和一个具体方法。Circle
实现抽象的 Area
方法,同时继承 Display
方法。这展示了抽象类如何提供部分实现。
多个抽象方法
抽象类可以定义多个必须实现的类。
Type Vehicle Abstract Declare Abstract Sub Start() Declare Abstract Sub Stop() Declare Abstract Function GetSpeed() As Integer End Type Type Car Extends Vehicle speed As Integer Declare Sub Start() Print "Car started" speed = 0 End Sub Declare Sub Stop() Print "Car stopped" speed = 0 End Sub Declare Function GetSpeed() As Integer Return speed End Sub End Type Dim As Car Ptr myCar = New Car myCar->Start() Print "Speed: "; myCar->GetSpeed() myCar->Stop() Delete myCar
Vehicle
抽象类定义了三个抽象方法。Car
类为所有这些方法提供了实现。任何继承自 Vehicle
的类都必须实现这些方法。
抽象属性
FreeBasic 允许在抽象类中使用抽象属性。
Type Person Abstract Declare Abstract Property Name() As String End Type Type Student Extends Person privateName As String Declare Property Name() As String Return privateName End Property Declare Property Name(ByVal n As String) privateName = n End Property End Type Dim As Student Ptr s = New Student s->Name = "Alice" Print "Student name: "; s->Name Delete s
此示例展示了 Person
类中的抽象属性。Student
类实现了该属性的 getter 和 setter。抽象属性强制跨派生类实现一致的接口。
抽象类继承
抽象类可以继承自其他抽象类。
Type Database Abstract Declare Abstract Sub Connect() End Type Type SqlDatabase Abstract Extends Database Declare Abstract Sub ExecuteQuery(query As String) End Type Type MySqlDatabase Extends SqlDatabase Declare Sub Connect() Print "Connected to MySQL" End Sub Declare Sub ExecuteQuery(query As String) Print "Executing: "; query End Sub End Type Dim As MySqlDatabase Ptr db = New MySqlDatabase db->Connect() db->ExecuteQuery("SELECT * FROM users") Delete db
这里我们有一个抽象类的层次结构。SqlDatabase
继承自 Database
并添加了另一个抽象方法。具体的 MySqlDatabase
实现所有继承的抽象方法。
接口状抽象类
抽象类可用于创建类似接口的结构。
Type Drawable Abstract Declare Abstract Sub Draw() End Type Type Circle Extends Drawable Declare Sub Draw() Print "Drawing a circle" End Sub End Type Type Square Extends Drawable Declare Sub Draw() Print "Drawing a square" End Sub End Type Dim As Drawable Ptr shapes(0 To 1) = {New Circle, New Square} For i As Integer = 0 To 1 shapes[i]->Draw() Delete shapes[i] Next
此示例展示了使用抽象类作为接口的多态性。Circle
和 Square
都实现了 Draw
方法。我们可以将不同类型的对象存储在基抽象类型的数组中。
带构造函数的抽象类
抽象类可以有构造函数,由派生类调用。
Type Logger Abstract protected: logLevel As Integer public: Declare Constructor(level As Integer) logLevel = level End Constructor Declare Abstract Sub Log(message As String) End Type Type FileLogger Extends Logger Declare Constructor(level As Integer) Base.Constructor(level) End Constructor Declare Sub Log(message As String) Print "["; logLevel; "] "; message End Sub End Type Dim As FileLogger Ptr logger = New FileLogger(2) logger->Log("System started") Delete logger
Logger
抽象类有一个初始化日志级别的构造函数。FileLogger
类调用基类构造函数并实现抽象的 Log
方法。抽象类构造函数有助于初始化通用状态。
最佳实践
- 命名:为抽象类使用描述性名称,表明其用途。
- 文档:清晰地记录抽象方法预期的行为。
- 简洁性:使抽象类专注于单一职责。
- 实现:确保所有抽象方法都在派生类中实现。
- 设计:使用抽象类为相关类定义通用接口。
本教程涵盖了 FreeBasic Abstract
关键字,并通过实际示例展示了其在不同场景下的用法。抽象类是创建灵活且可维护的面向对象设计的强大工具。