如何在派生类中继承抽象保护的嵌套类

时间:2009-08-31 23:17:25

标签: asp.net oop inheritance nested

我还没有真正做到这一点,也许我不需要,但这对我来说是有道理的。我有一个基类,比如BaseClass,我有几个派生类,比如Derived1Derived2Derived3。我有几个操作只适用于一个特定的功能,即生成PDF。我的想法是采用所有这些方法(一些是从基类中抽象出来的)并将它们插入到基类中的嵌套抽象类中,如下所示:

Public MustInherit Class BaseClass
    Protected MustOverride Sub MethodA()
    Protected MustOverride Sub MethodB()

    ...stuff

    Protected MustInherit Class PDFOperations
        Protected MustOverride Sub Method1()
        Protected MustOverride Sub Method2()

        etc.

    End Class
End Class

这样,当我想在课堂上找到一些东西时,我可以从其他所有内容中抽象出我的PDF操作,这将使我的界面更清晰。有没有办法这样做,以便我的派生类将被强制覆盖嵌套类及其所有方法?或者这只是一种愚蠢的方式来做这件事?

1 个答案:

答案 0 :(得分:1)

你的思路是可以理解的,你只需要更进一步。

Public MustInherit Class BaseClass
    Protected MustOverride Sub MethodA()
    Protected MustOverride Sub MethodB()

    ...stuff

    Protected MustInherit Class PDFOperations
        Protected MustOverride Sub Method1()
        Protected MustOverride Sub Method2()

        etc.

    End Class

    Protected MustOverride ReadOnly Property PDF
End Class

简单地使嵌套类抽象是不足以要求继承的类实际实现它们(因为你实际上并没有在任何地方引用该类)。 .NET嵌套类类似于Java中的嵌套static类,因为它们没有引用包含类的特定实例,它们只是由于外部类而被分组,缺少更好的术语。可以访问包含类的私有,受保护和内部成员。

通过提供抽象内部类类型的抽象readonly属性,您需要继承类提供它的一些具体实现,并且应该按照您的意愿分解您的方法。

修改

虽然不可能绝对强制执行从BaseClass继承的每个类都提供PDFOperations类的独特实现,但这是从实际角度强制执行的,因为任何继承自{{ {1}}必须是继承自PDFOperations的类的Protected嵌套类。这意味着他们无法共享实现。

<强>实施例

BaseClass

Public Class DerivedOne Inherits BaseClass Protected Overrides Sub MethodA() ... Protected Overrides Sub MethodB() ... Private pdfInstance as PDFOne Protected Class PDFOne Inherits PDFOperations Protected Overrides Sub Method1() ... Protected Overrides Sub Method2() ... Private instance as DerivedOne Public Sub New(ByVal instance as DerivedOne) Me.instance = instance End Sub End Class Protected Overrides ReadOnly Property PDF Get If pdfInstance is Nothing Then pdfInstance = new PDFOne(Me) return pdfInstance End Get End Property End Class Public Class DerivedTwo Inherits BaseClass Protected Overrides Sub MethodA() ... Protected Overrides Sub MethodB() ... Private pdfInstance as PDFTwo Protected Class PDFTwo Inherits PDFOperations Protected Overrides Sub Method1() ... Protected Overrides Sub Method2() ... Private instance as DerivedTwo Public Sub New(ByVal instance as DerivedTwo) Me.instance = instance End Sub End Class Protected Overrides ReadOnly Property PDF Get If pdfInstance is Nothing Then pdfInstance = new PDFTwo(Me) return pdfInstance End Get End Property End Class PDFOne中,有一个名为PDFTwo的实例变量,它表示对从instance继承的包含对象的引用