我使用一个Factory 模块,每个类包含一个(或多个)构造函数,它调用每个类的Init 成员。
例如Point 类:
Class Point
Private X, Y
Sub Init(X, Y)
Me.X = X
Me.Y = Y
End Sub
一个Line 类
Class Line
Private P1, P2
Sub Init(Optional P1, Optional P2, Optional X1, Optional X2, Optional Y1, Optional Y2)
If P1 Is Nothing Then
Set Me.P1 = NewPoint(X1, Y1)
Set Me.P2 = NewPoint(X2, Y2)
Else
Set Me.P1 = P1
Set Me.P2 = P2
End If
End Sub
还有一个Factory 模块:
Module Factory
Function NewPoint(X, Y)
Set NewPoint = New Point
NewPoint.Init X, Y
End Function
Function NewLine(Optional P1, Optional P2, Optional X1, Optional X2, Optional Y1, Optional Y2)
Set NewLine = New Line
NewLine.Init P1, P2, X1, Y1, X2, Y2
End Function
Function NewLinePt(P1, P2)
Set NewLinePt = New Line
NewLinePt.Init P1:=P1, P2:=P2
End Function
Function NewLineXY(X1, Y1, X2, Y2)
Set NewLineXY = New Line
NewLineXY.Init X1:=X1, Y1:=Y1, X2:=X2, Y2:=Y2
End Function
这种方法的一个很好的方面是可以很容易地在表达式中使用工厂函数。例如,可以执行以下操作:
D = Distance(NewPoint(10, 10), NewPoint(20, 20)
或:
D = NewPoint(10, 10).Distance(NewPoint(20, 20))
它很干净:工厂做的很少,它在所有对象中始终如一地做,只是创建和一个Init 调用每个creator。
而且它是相当面向对象的:Init 函数是在对象内部定义的。
编辑
我忘了补充一点,这允许我创建静态方法。例如,我可以做类似的事情(在使参数可选之后):
NewLine.DeleteAllLinesShorterThan 10
不幸的是,每次都会创建一个新的对象实例,因此任何静态变量在执行后都会丢失。此伪静态方法中使用的行集合和任何其他静态变量必须在模块中定义。