2

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

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

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

我正在考虑删除MustInherit关键字。这会有什么不同吗?

谢谢。

预计到达时间:

我想我已经回答了我的问题,如果我删除 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
4

3 回答 3

1

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

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

于 2009-07-05T14:32:07.140 回答
0

如果该类只有一个受保护的构造函数,则仍然可以拥有一个可以独立存在的类的实例。它需要解决受保护的构造函数,例如使用反射。

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

于 2009-07-05T14:39:11.213 回答
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
于 2009-07-12T08:58:51.657 回答