1

今天我遇到了通过工厂方法创建子类实例的问题。假设我有一个简单的类型层次结构,其中包含一个抽象基类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

这工作得很好。但现在另外,我想在不使用工厂方法的情况下防止子类的实例化

所以我的第一个想法是让子类的构造函数 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为多个文件,然后将每个子类放入其自己的文件中。但这并不能真正让我满意,它看起来很笨拙,也不是很优雅。

4

1 回答 1

0

您应该查看 Microsoft 的此访问级别。正如@LarsTech 所说,只要您正在创建自己的库/dll,朋友就是您的答案。

于 2013-10-25T16:12:13.773 回答