今天我遇到了通过工厂方法创建子类实例的问题。假设我有一个简单的类型层次结构,它带有一个抽象基类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
这完全没问题。但是现在另外,我想在不使用工厂方法的情况下阻止子类的实例化。
所以我的第一个想法是使子类的构造函数受保护,但事实证明受保护的仅在继承行中工作,而不是向上到基类
然后我尝试在工厂方法中使用 Activator.CreateInstance ,这会产生可编译的代码,但会引发运行时异常(因为它无法访问受保护的构造函数)。
我知道工厂方法通常用于将接口类型返回到外部世界(到其他程序集),但我希望在我的代码的其他位置意外地使用构造函数提供相同级别的保护。当然,为此创建一个自己的程序集并使子类构造函数 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
拆分为多个文件,然后将每个子类放入自己的文件中。但这并不能让我满意,看起来很笨拙而且不是很优雅。