具有受保护构造函数的类与标记为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
答案 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