类型作为对象 (Types as Objects)
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=ProPgTypeObjects
- 最后更新: 2019-11-21
可重载运算符和成员过程的示例
描述
当使用 Type 结构体定义用户对象时,还可以在数据字段骨架中添加多种过程,以简化任何用户的使用:
Sub、Function 和属性成员。
构造函数和析构函数。
重载运算符(在 Type 定义内部和外部)。
以下示例只是它们声明和定义的语法模板:
start GeSHi
vb
'' 示例类型,展示所有可用的方法和运算符
'' 实际上这是一个没有实际意义的示例,唯一的
'' 数据成员是一个 Integer,它仅作为
'' 语法参考。
''
'' 还有许多其他组合可以
'' 用于传入参数。为简便起见,
'' 本示例在可能的情况下只使用 byref 和类型 T。
'' 类型 'DataType' 用于表示任意数据类型可以使用的位置
Type DataType As Integer
'' 类型 'UDT' 用于表示只能使用 UDT 数据类型的位置
Type UDT
value As DataType
End Type
'' 我们的主类型
Type T
value As DataType
value_array( 0 ) As DataType
'' let、cast、复合赋值运算符、
'' 构造函数和析构函数必须在类型内部
'' 声明。
''
'' 参数在大多数情况下可以通过 Byval 或 Byref 传递
''(所有情况?待验证)。
''
'' 所有过程均可通过不同的参数类型
'' 重载。在许多情况下不需要这样做,
'' 因为 TYPE 可以根据暴露的 CAST 方法
'' 进行强制转换。
'' 编译器会尽力对语句和表达式进行求值,
'' 只要有足够的信息完成
'' 该操作即可。
''
'' 例如,
'' 即使未重载 operator +=,
'' 但若 operator let 和 operator + 已重载,
'' 编译器也会将 T += datatype
'' 转换为 T = T + datatype。
'' 非静态成员必须在类型内部声明。
''
'' 所有非静态成员都隐式传递一个
'' 隐藏的 **this** 参数,其类型与
'' 声明它们的 TYPE 相同。
''
'' 非静态成员重载运算符不返回类型,
'' 所有操作都在隐藏的 this 参数上进行。
''
'' 属性:可以是值属性或单个
'' 索引值属性
'' GET/SET 方法在使用时必须各自声明。
'' 非静态成员声明:
'' 内存分配/释放
Declare Operator New ( ByVal size As UInteger ) As Any Ptr
Declare Operator New[] ( ByVal size As UInteger ) As Any Ptr
Declare Operator Delete ( ByVal buf As Any Ptr )
Declare Operator Delete[] ( ByVal buf As Any Ptr )
'' 赋值
Declare Operator Let ( ByRef rhs As T )
Declare Operator Let ( ByRef rhs As DataType )
'' Cast 可以重载以返回多种类型
Declare Operator Cast () As String
Declare Operator Cast () As DataType
'' 复合赋值
Declare Operator += ( ByRef rhs As T )
Declare Operator += ( ByRef rhs As DataType )
Declare Operator -= ( ByRef rhs As DataType )
Declare Operator *= ( ByRef rhs As DataType )
Declare Operator /= ( ByRef rhs As DataType )
Declare Operator \= ( ByRef rhs As DataType )
Declare Operator Mod= ( ByRef rhs As DataType )
Declare Operator Shl= ( ByRef rhs As DataType )
Declare Operator Shr= ( ByRef rhs As DataType )
Declare Operator And= ( ByRef rhs As DataType )
Declare Operator Or= ( ByRef rhs As DataType )
Declare Operator Xor= ( ByRef rhs As DataType )
Declare Operator Imp= ( ByRef rhs As DataType )
Declare Operator Eqv= ( ByRef rhs As DataType )
Declare Operator ^= ( ByRef rhs As DataType )
Declare Operator &= ( ByRef rhs As DataType )
'' 取地址
Declare Operator @ () As DataType Ptr
'' 构造函数可以重载
Declare Constructor ()
Declare Constructor ( ByRef rhs As T )
Declare Constructor ( ByRef rhs As DataType )
'' 析构函数只能有一个
Declare Destructor ()
'' 非静态成员函数和子程序
'' 重载过程必须有不同的参数
Declare Function f ( ) As DataType
Declare Function f ( ByRef arg1 As DataType ) As DataType
Declare Sub s ( )
Declare Sub s ( ByRef arg1 As T )
Declare Sub s ( ByRef arg1 As DataType )
'' 属性
Declare Property p () As DataType
Declare Property p ( ByRef new_value As DataType )
Declare Property pidx ( ByVal index As DataType ) As DataType
Declare Property pidx ( ByVal index As DataType, ByRef new_value As DataType )
'' 迭代器
Declare Operator For ()
Declare Operator Step ()
Declare Operator Next ( ByRef cond As T ) As Integer
Declare Operator For ( ByRef stp As T )
Declare Operator Step ( ByRef stp As T )
Declare Operator Next ( ByRef cond As T, ByRef stp As T ) As Integer
End Type
'' 这些必须是全局过程
'' 全局过程不以 TYPE 名称为前缀
'' 至少有一个参数必须是类型 'T'
'' 为简便起见,本示例中二元运算符
'' 总是将类型 'T' 放在第一位
Declare Operator - ( ByRef rhs As T ) As DataType
Declare Operator Not ( ByRef rhs As T ) As DataType
Declare Operator -> ( ByRef rhs As T ) As UDT
Declare Operator * ( ByRef rhs As T ) As DataType
Declare Operator + ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator - ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator * ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator / ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator \ ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator Mod ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator Shl ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator Shr ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator And ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator Or ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator Xor ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator Imp ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator Eqv ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator ^ ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator = ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator <> ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator < ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator > ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator <= ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator >= ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator & ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Declare Operator Abs ( ByRef arg As UDT ) As Double
Declare Operator Fix ( ByRef arg As UDT ) As Double
Declare Operator frac ( ByRef arg As UDT ) As Double
Declare Operator Int ( ByRef arg As UDT ) As Double
Declare Operator Sgn ( ByRef arg As UDT ) As Double
'' 全局过程(子程序和函数)也可以接受该 TYPE
'' 作为参数或返回值,就像在
'' 早期版本的 FreeBASIC 中一样。
'' 此处不提供示例,请参阅手册中的函数或子程序。
'' 所有 TYPE 成员都在 TYPE 外部定义
'' 非静态成员必须以类型名称为前缀
'' 本例中为 'T'
'' 命名空间中的名称解析与其他
'' 子程序/函数相同,使用 USING 或命名空间前缀
Operator T.New ( ByVal size As UInteger ) As Any Ptr
Operator = Allocate( size )
End Operator
Operator T.New[] ( ByVal size As UInteger ) As Any Ptr
Operator = Allocate( size )
End Operator
Operator T.Delete ( ByVal buf As Any Ptr )
Deallocate buf
End Operator
Operator T.Delete[] ( ByVal buf As Any Ptr )
Deallocate buf
End Operator
Operator T.Let ( ByRef rhs As T )
value = rhs.value
End Operator
Operator T.Let ( ByRef rhs As DataType )
value = rhs
End Operator
Operator T.Cast ( ) As String
Return Str( value )
End Operator
Operator T.Cast ( ) As DataType
Return value
End Operator
Operator T.+= ( ByRef rhs As T )
value += rhs.value
End Operator
Operator T.+= ( ByRef rhs As DataType )
value += rhs
End Operator
Operator T.-= ( ByRef rhs As DataType )
value -= rhs
End Operator
Operator T.*= ( ByRef rhs As DataType )
value *= rhs
End Operator
Operator T./= ( ByRef rhs As DataType )
value /= rhs
End Operator
Operator T.\= ( ByRef rhs As DataType )
value \= rhs
End Operator
Operator T.Mod= ( ByRef rhs As DataType )
value Mod= rhs
End Operator
Operator T.Shl= ( ByRef rhs As DataType )
value Shl= rhs
End Operator
Operator T.Shr= ( ByRef rhs As DataType )
value Shr= rhs
End Operator
Operator T.And= ( ByRef rhs As DataType )
value And= rhs
End Operator
Operator T.Or= ( ByRef rhs As DataType )
value Or= rhs
End Operator
Operator T.Xor= ( ByRef rhs As DataType )
value Xor= rhs
End Operator
Operator T.Imp= ( ByRef rhs As DataType )
value Imp= rhs
End Operator
Operator T.Eqv= ( ByRef rhs As DataType )
value Eqv= rhs
End Operator
Operator T.^= ( ByRef rhs As DataType )
value ^= rhs
End Operator
Operator T.&= ( ByRef rhs As DataType )
Dim tmp As String
tmp &= Str( rhs )
End Operator
Operator T.@ () As DataType Ptr
Return( Cast( DataType Ptr, @This ))
End Operator
'' Constructors:
Constructor T ()
'' 默认构造函数
value = 0
End Constructor
Constructor T ( ByRef rhs As T )
'' 拷贝构造函数
value = rhs.value
End Constructor
Constructor T ( ByRef rhs As DataType )
'' 自定义构造函数
value = rhs
End Constructor
'' 析构函数只能有一个
Destructor T ()
'' 清理工作,本示例中无
End Destructor
'' 全局过程必须指定所有参数和返回类型
Operator - ( ByRef rhs As T ) As DataType
Return (-rhs.value)
End Operator
Operator Not ( ByRef rhs As T ) As DataType
Return (Not rhs.value)
End Operator
Operator -> ( ByRef rhs As T ) As UDT
Return Type(4)
End Operator
Operator * ( ByRef rhs As T ) As DataType
Return 5
End Operator
Operator + ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return (lhs.value + rhs)
End Operator
Operator - ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return (lhs.value - rhs)
End Operator
Operator * ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return (lhs.value * rhs)
End Operator
Operator / ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return (lhs.value / rhs)
End Operator
Operator \ ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return (lhs.value \ rhs)
End Operator
Operator Mod ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return (lhs.value Mod rhs)
End Operator
Operator Shl ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return (lhs.value Shl rhs)
End Operator
Operator Shr ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return (lhs.value Shr rhs)
End Operator
Operator And ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return (lhs.value And rhs)
End Operator
Operator Or ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return (lhs.value Or rhs)
End Operator
Operator Xor ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return (lhs.value Xor rhs)
End Operator
Operator Imp ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return (lhs.value Imp rhs)
End Operator
Operator Eqv ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return (lhs.value Eqv rhs)
End Operator
Operator ^ ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return (lhs.value ^ rhs)
End Operator
Operator = ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return (lhs.value = rhs)
End Operator
Operator <> ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return (lhs.value <> rhs)
End Operator
Operator < ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return (lhs.value < rhs)
End Operator
Operator > ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return (lhs.value > rhs)
End Operator
Operator <= ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return (lhs.value <= rhs)
End Operator
Operator >= ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return (lhs.value >= rhs)
End Operator
Operator & ( ByRef lhs As T, ByRef rhs As DataType ) As DataType
Return Val(lhs.value & rhs)
End Operator
Operator Abs ( ByRef arg As UDT ) As Double
Return Abs(arg.value)
End Operator
Operator Fix ( ByRef arg As UDT ) As Double
Return Fix(arg.value)
End Operator
Operator frac ( ByRef arg As UDT ) As Double
Return frac(arg.value)
End Operator
Operator Int ( ByRef arg As UDT ) As Double
Return Int(arg.value)
End Operator
Operator Sgn ( ByRef arg As UDT ) As Double
Return Sgn(arg.value)
End Operator
'' 非静态成员方法
Function T.f ( ) As DataType
Dim x As DataType
Return x
End Function
Function T.f ( ByRef arg1 As DataType ) As DataType
arg1 = This.value
Return value
End Function
Sub T.s ( )
'' 通过以下方式引用类型
'' With 块
With This
.value = 1
End With
'' 字段访问
This.value = 2
'' 直接访问
value = 3
End Sub
Sub T.s ( ByRef arg1 As T )
value = arg1.value
End Sub
Sub T.s ( ByRef arg1 As DataType )
value = arg1
End Sub
Property T.p () As DataType
'' GET 属性
Return value
End Property
Property T.p ( ByRef new_value As DataType )
'' SET 属性
value = new_value
End Property
Property T.pidx ( ByVal index As DataType ) As DataType
'' GET 索引属性
Return value_array( index )
End Property
Property T.pidx ( ByVal index As DataType, ByRef new_value As DataType )
'' SET 索引属性
value_array( index ) = new_value
End Property
Operator T.For ()
End Operator
Operator T.Step ()
End Operator
Operator T.Next ( ByRef cond As T ) As Integer
Return 0
End Operator
Operator T.For ( ByRef stp As T )
End Operator
Operator T.Step ( ByRef stp As T )
End Operator
Operator T.Next ( ByRef cond As T, ByRef stp As T ) As Integer
Return 0
End Operator
'' new、delete、delete[]
'' 分配对象
Dim X As T Ptr = New T
'' 释放对象
Delete X
'' 分配对象 vector
Dim Xlist As T Ptr = New T[10]
'' 释放对象 vector
Delete[] Xlistend GeSHi
参见
Type
返回 目录