ZetCode

FreeBasic Override 关键字

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

FreeBasic 的 Override 关键字通过允许派生类提供基类中已定义的方法的特定实现来实现多态。这是 FreeBasic 面向对象编程的基础。

基本定义

在 FreeBasic 中,Override 用于派生类中的方法声明,以指示该方法替换了基类的继承的虚拟方法。方法签名必须完全匹配。

方法重写实现了运行时多态,其中根据实际对象类型而不是引用类型调用相应的方法版本。这是继承层次结构的关键功能。

简单的 Override 示例

这个基本示例演示了使用 Override 关键字的方法重写。

override_simple.bas
Type Animal
    Declare Virtual Sub MakeSound()
End Type

Type Dog Extends Animal
    Declare Sub MakeSound() Override
End Type

Sub Animal.MakeSound()
    Print "Animal sound"
End Sub

Sub Dog.MakeSound()
    Print "Woof!"
End Sub

Dim As Animal Ptr a = New Dog
a->MakeSound()
Delete a

在这里,我们定义了一个具有虚拟 MakeSound 方法的基类 Animal。Dog 类重写了这个方法。当通过 Animal 指针调用时,由于多态性,Dog 版本会执行。Override 关键字使这一点变得明确。

带参数的 Override

重写的方法可以像它们的基类版本一样接受参数。

override_parameters.bas
Type Shape
    Declare Virtual Function Area(w As Integer, h As Integer) As Integer
End Type

Type Rectangle Extends Shape
    Declare Function Area(w As Integer, h As Integer) Override
End Type

Function Shape.Area(w As Integer, h As Integer) As Integer
    Return 0
End Function

Function Rectangle.Area(w As Integer, h As Integer) As Integer
    Return w * h
End Function

Dim As Shape Ptr s = New Rectangle
Print "Area: "; s->Area(4, 5)
Delete s

Rectangle 类用自己的实现重写了 Shape 的 Area 方法。参数必须完全匹配。Override 关键字确保我们正确地重写了基类的方法。

多层 Override

方法可以在继承层次结构的多层中被重写。

override_multilevel.bas
Type Vehicle
    Declare Virtual Sub Start()
End Type

Type Car Extends Vehicle
    Declare Sub Start() Override
End Type

Type ElectricCar Extends Car
    Declare Sub Start() Override
End Type

Sub Vehicle.Start()
    Print "Starting vehicle"
End Sub

Sub Car.Start()
    Print "Starting car engine"
End Sub

Sub ElectricCar.Start()
    Print "Starting electric motor"
End Sub

Dim As Vehicle Ptr v = New ElectricCar
v->Start()
Delete v

这展示了一个三层继承层次结构,其中 Start 被重写了两次。ElectricCar 版本通过 Vehicle 指针被调用,演示了多态行为。每次重写都必须明确标记。

带不同访问权限的 Override

重写的方法可以具有与其基类版本不同的访问修饰符。

override_access.bas
Type Base
    Declare Virtual Protected Sub Method()
End Type

Type Derived Extends Base
    Declare Sub Method() Override
End Type

Sub Base.Method()
    Print "Base method"
End Sub

Sub Derived.Method()
    Print "Derived method"
End Sub

Dim As Derived d
d.Method()

在这里,基类方法是 protected,而派生版本是 public。由于方法签名匹配,Override 关键字仍然适用。访问修饰符不影响重写,只影响可见性。

带 Override 的抽象基类

抽象方法必须在具体的派生类中被重写。

override_abstract.bas
Type AbstractBase
    Declare Abstract Sub MustImplement()
End Type

Type Concrete Extends AbstractBase
    Declare Sub MustImplement() Override
End Type

Sub Concrete.MustImplement()
    Print "Implemented in concrete class"
End Sub

Dim As Concrete c
c.MustImplement()

AbstractBase 定义了一个 Concrete 必须实现的抽象方法。Override 关键字将其标记为抽象方法的实现。这对于抽象方法是强制性的,不像常规的虚拟方法。

带返回类型的 Override

在 FreeBasic 中,重写的方法可以具有协变返回类型。

override_covariant.bas
Type BaseType
End Type

Type DerivedType Extends BaseType
End Type

Type BaseClass
    Declare Virtual Function Create() As BaseType Ptr
End Type

Type DerivedClass Extends BaseClass
    Declare Function Create() As DerivedType Ptr Override
End Type

Function BaseClass.Create() As BaseType Ptr
    Return New BaseType
End Function

Function DerivedClass.Create() As DerivedType Ptr
    Return New DerivedType
End Function

Dim As BaseClass Ptr b = New DerivedClass
Dim As BaseType Ptr obj = b->Create()
Delete obj
Delete b

这演示了协变返回类型,其中重写的方法返回更具体的类型。DerivedClass 的 Create 返回一个 DerivedType 指针,同时仍然满足基方法契约。仍然需要 Override 关键字。

Override 与 Overload

这个例子对比了重写和重载。

override_vs_overload.bas
Type Base
    Declare Virtual Sub Process(x As Integer)
    Declare Sub Process(s As String)
End Type

Type Derived Extends Base
    Declare Sub Process(x As Integer) Override
    Declare Sub Process(s As String, y As Integer)
End Type

Sub Base.Process(x As Integer)
    Print "Base Process Integer: "; x
End Sub

Sub Base.Process(s As String)
    Print "Base Process String: "; s
End Sub

Sub Derived.Process(x As Integer)
    Print "Derived Process Integer: "; x
End Sub

Sub Derived.Process(s As String, y As Integer)
    Print "Derived Process String+Integer: "; s; y
End Sub

Dim As Derived d
d.Process(10)
d.Process("test")
d.Process("test", 20)

这里 Process(Integer) 被重写,而 Process(String) 被继承,Process(String,Integer) 被重载。只有第一个需要 Override,因为它替换了一个虚拟方法。重载添加了具有不同签名的新方法。

最佳实践

本教程通过实际示例介绍了 FreeBasic 的 Override 关键字,展示了其在不同多态场景下的用法。

作者

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

列出所有 FreeBasic 教程