ZetCode

FreeBasic Abstract 关键字

最后修改日期:2025 年 6 月 16 日

FreeBasic 的 Abstract 关键字用于创建不能直接实例化的抽象类和抽象方法。抽象类用作继承层次结构的基础类。

基本定义

在 FreeBasic 中,Abstract 标记的类或方法必须由派生类实现。抽象类不能直接实例化,而是为了继承而设计的。

抽象方法在基类中没有实现。派生类必须为所有抽象方法提供具体的实现。这实现了多态性并强制执行了一致的接口。

简单的抽象类

此示例演示了抽象类的基本结构。

abstract_simple.bas
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 的实例。

带具体方法的抽象类

抽象类可以包含抽象方法和已实现的方法。

abstract_mixed.bas
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 方法。这展示了抽象类如何提供部分实现。

多个抽象方法

抽象类可以定义多个必须实现的类。

abstract_multiple.bas
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 允许在抽象类中使用抽象属性。

abstract_property.bas
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。抽象属性强制跨派生类实现一致的接口。

抽象类继承

抽象类可以继承自其他抽象类。

abstract_inheritance.bas
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 实现所有继承的抽象方法。

接口状抽象类

抽象类可用于创建类似接口的结构。

abstract_interface.bas
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

此示例展示了使用抽象类作为接口的多态性。CircleSquare 都实现了 Draw 方法。我们可以将不同类型的对象存储在基抽象类型的数组中。

带构造函数的抽象类

抽象类可以有构造函数,由派生类调用。

abstract_constructor.bas
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 关键字,并通过实际示例展示了其在不同场景下的用法。抽象类是创建灵活且可维护的面向对象设计的强大工具。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。我自 2007 年开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教学编程方面拥有超过十年的经验。

列出所有 FreeBasic 教程