ZetCode

FreeBasic Type 关键字

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

FreeBasic 的 Type 关键字允许创建用户定义类型 (UDT)。这些是复合数据类型,可以将相关的变量分组在一起。UDT 有助于组织程序中的复杂数据结构。

基本定义

在 FreeBasic 中,Type 定义了一个包含一个或多个成员的新数据结构。每个成员可以是任何有效的 FreeBasic 数据类型,包括其他 UDT。类型类似于 C 中的 struct 或 Pascal 中的 record。

UDT 提供更好的代码组织、提高可读性以及更轻松的数据管理。它们对于 FreeBasic 中的面向对象编程至关重要。Type 块必须以 End Type 结尾。

简单类型声明

本示例展示了如何声明一个基本的用户定义类型。

simple_type.bas
Type Point
    x As Integer
    y As Integer
End Type

Dim p As Point
p.x = 10
p.y = 20

Print "Point coordinates: ("; p.x; ", "; p.y; ")"

这里我们定义了一个带有 x 和 y 坐标的 Point 类型。然后我们声明一个该类型的变量,并使用点表示法访问其成员。这为相关数据创建了一个逻辑分组。

包含不同数据类型的类型

类型可以包含各种数据类型的成员。

mixed_type.bas
Type Employee
    name As String
    age As Integer
    salary As Double
    isActive As Boolean
End Type

Dim emp As Employee
emp.name = "John Smith"
emp.age = 42
emp.salary = 55000.75
emp.isActive = True

Print "Employee: "; emp.name
Print "Age: "; emp.age
Print "Salary: $"; emp.salary
Print "Active: "; emp.isActive

这个 Employee 类型结合了字符串、整数、双精度浮点数和布尔成员。每个成员存储了员工数据的不同方面。该示例展示了如何初始化和访问这些成员。

包含数组的类型

类型可以包含数组成员,用于存储多个值。

type_with_array.bas
Type Student
    name As String
    grades(4) As Integer  ' Array of 5 grades
End Type

Dim s As Student
s.name = "Alice"
s.grades(0) = 85
s.grades(1) = 90
s.grades(2) = 78
s.grades(3) = 92
s.grades(4) = 88

Print "Student: "; s.name
Print "Grades:";
For i As Integer = 0 To 4
    Print " "; s.grades(i);
Next
Print

Student 类型包括一个用于姓名的字符串和一个用于成绩的整数数组。这展示了如何在类型中使用数组成员,包括初始化和访问。

嵌套类型

类型可以包含其他类型作为成员,从而实现复杂的数据结构。

nested_types.bas
Type Address
    street As String
    city As String
    zip As String
End Type

Type Person
    name As String
    age As Integer
    home As Address
End Type

Dim p As Person
p.name = "Bob Johnson"
p.age = 35
p.home.street = "123 Main St"
p.home.city = "Springfield"
p.home.zip = "12345"

Print "Name: "; p.name
Print "Address: "; p.home.street; ", "; p.home.city; " "; p.home.zip

本示例显示了一个包含 Address 类型的 Person 类型。我们使用多个点运算符访问嵌套成员。这创建了一个分层数据结构。

包含过程的类型

FreeBasic 允许向类型添加过程(方法)以进行面向对象编程。

type_with_procedures.bas
Type Rectangle
    width As Double
    height As Double
    
    Declare Function Area() As Double
    Declare Sub Resize(newWidth As Double, newHeight As Double)
End Type

Function Rectangle.Area() As Double
    Return width * height
End Function

Sub Rectangle.Resize(newWidth As Double, newHeight As Double)
    width = newWidth
    height = newHeight
End Sub

Dim rect As Rectangle
rect.width = 10.5
rect.height = 20.3

Print "Initial area: "; rect.Area()
rect.Resize(15.0, 25.0)
Print "New area: "; rect.Area()

这里我们定义了一个带有数据成员和方法的 Rectangle 类型。Area 函数计算面积,而 Resize 修改尺寸。这展示了基本的面向对象功能。

类型初始化

类型可以使用 FreeBasic 中的各种方法进行初始化。

type_initialization.bas
Type Book
    title As String
    author As String
    pages As Integer
    price As Double
End Type

' Method 1: Individual member assignment
Dim b1 As Book
b1.title = "The Hobbit"
b1.author = "J.R.R. Tolkien"
b1.pages = 310
b1.price = 12.99

' Method 2: Initializer list
Dim b2 As Book = ("Dune", "Frank Herbert", 412, 15.50)

' Method 3: With statement
Dim b3 As Book
With b3
    .title = "1984"
    .author = "George Orwell"
    .pages = 328
    .price = 9.99
End With

Print b1.title; " by "; b1.author
Print b2.title; " by "; b2.author
Print b3.title; " by "; b3.author

本示例显示了初始化类型变量的三种方法:单独的成员赋值、初始化列表和 With 语句。每种方法根据情况都有其优点。

类型指针

类型指针允许高效地操作类型变量。

type_pointers.bas
Type Car
    make As String
    model As String
    year As Integer
End Type

Dim myCar As Car
myCar.make = "Toyota"
myCar.model = "Corolla"
myCar.year = 2020

Dim pCar As Car Ptr = @myCar

Print "Car details:"
Print "Make: "; pCar->make
Print "Model: "; pCar->model
Print "Year: "; pCar->year

这里我们创建了一个指向 Car 类型变量的指针。箭头运算符 (->) 通过指针访问成员。这对于高效传递大型类型非常有用。

最佳实践

本教程通过实际示例介绍了 FreeBasic 的 Type 关键字,展示了其在不同场景下的用法。类型是组织程序中复杂数据的强大工具。

作者

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

列出所有 FreeBasic 教程