【问题标题】:Protected Constructors and MustInherit/ Abstract class受保护的构造函数和 MustInherit/ 抽象类
【发布时间】:2010-11-08 05:21:10
【问题描述】:

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

【问题讨论】:

  • 你应该指出你在说什么语言。
  • 谢谢你,我已经更新表明它是 vb.net 或 c#

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


【解决方案1】:

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

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

【讨论】:

  • 是的,像往常一样,我一发布就意识到我需要一个抽象类来包含 MustOverride 方法。所以,澄清一下,除非我删除 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
  • 乱七八糟的,我已经把上面的加到OP里了!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    不太确定你想要什么。

    如果您需要创建抽象类的对象,我建议您创建抽象类的私有类实现并在您的 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
    

    【讨论】:

      猜你喜欢
      • 2013-11-13
      • 2015-11-17
      • 1970-01-01
      • 2013-08-29
      • 2011-01-13
      • 2012-08-18
      • 2011-05-30
      • 2019-11-18
      • 1970-01-01
      相关资源
      最近更新 更多