在工厂方法中创建子类的实例,而不暴露子类的构造函数

时间:2013-10-25 15:06:33

标签: .net vb.net oop design-patterns inheritance

今天我遇到了通过工厂方法创建子类实例的问题。假设我有一个简单的类型层次结构,它带有一个抽象基类BaseClass和两个子类SubClass1SubClass2。我现在想要一个工厂方法,根据输入参数创建两个子类的实例,如下面的代码所示:

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拆分为多个文件,然后将每个子类放入自己的文件中。但这并不能让我满意,看起来很笨拙而且不是很优雅。

1 个答案:

答案 0 :(得分:0)

您应该从Microsoft查看此Access Levels。正如@LarsTech所说,只要您创建自己的库/ dll,朋友就是您的答案。