今天我遇到了通过工厂方法创建子类实例的问题。假设我有一个简单的类型层次结构,其中包含一个抽象基类BaseClass
和两个子类SubClass1
和SubClass2
. 我现在想要一个工厂方法,它根据输入参数创建两个子类的实例,如下面的代码所示:
MustInherit Class BaseClass
Public Shared Function CreateInstance(x As Integer) As BaseClass
If x > 1000 Then
Return New SubClass1
Else
Return New SubClass2
End If
End Function
End Class
Class SubClass1
Inherits BaseClass
Sub New()
End Sub
End Class
Class SubClass2
Inherits BaseClass
Sub New()
End Sub
End Class
这工作得很好。但现在另外,我想在不使用工厂方法的情况下防止子类的实例化。
所以我的第一个想法是让子类的构造函数 Protected,但事实证明Protected只适用于继承线,而不是向上到基类。
然后我尝试在工厂方法中使用Activator.CreateInstance,这会导致代码可编译,但会引发运行时异常(因为它无法访问Protected构造函数)。
我知道工厂方法通常用于将接口类型返回给外部世界(其他程序集),但我希望得到相同级别的保护,以免在我的代码的其他位置意外使用构造函数。当然,为此创建一个自己的程序集并使子类构造函数成为Friend,但这不是一种选择(最终会产生数十个程序集......)。
我想做的在概念上是错误的吗?我不应该保护自己(和我的同事)不以错误的方式使用代码吗?
非常感谢四位您的帮助!
编辑:
一种可能性是使子类成为内部的私有类BaseClass
,例如
MustInherit Class BaseClass
Public Shared Function CreateInstance(x As Integer) As BaseClass
If x > 1000 Then
Return New SubClass1
Else
Return New SubClass2
End If
End Function
Private Class SubClass1
Inherits BaseClass
Sub New()
End Sub
End Class
Private Class SubClass2
Inherits BaseClass
Sub New()
End Sub
End Class
End Class
可以使用 Partial 关键字将其拆分BaseClass
为多个文件,然后将每个子类放入其自己的文件中。但这并不能真正让我满意,它看起来很笨拙,也不是很优雅。