受保护的构造函数和MustInherit / Abstract类

时间:2009-07-05 14:30:22

标签: vb.net oop constructor abstract-class protected

具有受保护构造函数的类与标记为MustInherit的类之间有什么区别? (我在VB.Net中编程,但它可能同样适用于c#)。

我问的原因是因为我有一个抽象类,我想将构造函数转换为共享/静态方法。 (添加一些约束)。

我不能这样做,因为无法在共享功能中创建实例。

我想删除MustInherit关键字。这有什么不同吗?

感谢。

ETA:

我想我已经回答了我的问题,如果我删除了MustInherit关键字,我就不能再包含MustOverrides了,这非常有用。

考虑到这一点,我的问题有什么办法吗?

ETA2:

澄清一下,除非我删除MustInherit关键字,否则我不能执行以下操作?

Public MustInherit MyBaseClass

  Private Sub New() 
  End Sub 

  Protected Function CreateInstance(ParmList) As MyBaseClass
    If ParmList is Ok Then Return New MyBaseClass()
  End Function 

End Class

3 个答案:

答案 0 :(得分:1)

您可以使用反射调用Protected构造函数并实例化该类,但不能以这种方式实例化abstract类。您可以在MustOverride类中声明MustInherit个方法,但Protected构造函数可以对派生类强制执行任何操作。

您应该始终将概念上抽象的类声明为MustInherit。当您提供Protected构造函数以及一些Public重载以向派生类提供更多功能时,{{1}}构造函数会很有用。

答案 1 :(得分:0)

如果类只有一个受保护的构造函数,那么仍然可以拥有一个可以独立存在的类的实例。它需要在受保护的构造函数周围工作,例如使用反射。

如果该类被标记为MustInherit,则不可能自己拥有该类的实例。只能为派生/继承的类创建实例。

答案 2 :(得分:0)

不确定你想要什么。

如果您需要创建抽象类的对象,我建议您创建抽象类的私有类实现并将其返回到CreateInstanceMethod中:

Public MustInherit MyBaseClass
    Private BaseClassImplementation
        Inherits MyBaseClass

        ...
    End Class

    Public Function CreateInstance(paramList) as MyBaseClass
        If paramList Is Ok Then Return New BaseClassImplementation
    End Function
End Class

但是,如果要为构造添加一些约束,我建议抛出异常:

Public MustInherit MyBaseClass
    Protected Sub New(paramList)
        If paramList IsNot Ok Then Thow New Exception
        ...
    End Sub
End Class