FreeBasic Override 关键字
最后修改日期:2025 年 6 月 16 日
FreeBasic 的 Override 关键字通过允许派生类提供基类中已定义的方法的特定实现来实现多态。这是 FreeBasic 面向对象编程的基础。
基本定义
在 FreeBasic 中,Override 用于派生类中的方法声明,以指示该方法替换了基类的继承的虚拟方法。方法签名必须完全匹配。
方法重写实现了运行时多态,其中根据实际对象类型而不是引用类型调用相应的方法版本。这是继承层次结构的关键功能。
简单的 Override 示例
这个基本示例演示了使用 Override 关键字的方法重写。
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
重写的方法可以像它们的基类版本一样接受参数。
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
方法可以在继承层次结构的多层中被重写。
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
重写的方法可以具有与其基类版本不同的访问修饰符。
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 的抽象基类
抽象方法必须在具体的派生类中被重写。
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 中,重写的方法可以具有协变返回类型。
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
这个例子对比了重写和重载。
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,因为它替换了一个虚拟方法。重载添加了具有不同签名的新方法。
最佳实践
- 显式 Override: 意图重写时,始终使用 Override 以使代码更清晰。
- 签名匹配: 确保参数类型和返回类型完全匹配。
- 文档: 记录重写方法的原因。
- 基类调用: 在适当的情况下考虑调用基类方法。
- 虚拟析构函数: 在使用多态性时,将析构函数设为虚拟。
本教程通过实际示例介绍了 FreeBasic 的 Override 关键字,展示了其在不同多态场景下的用法。