我还没有真正做到这一点,也许我不需要,但这对我来说是有道理的。我有一个基类,比如BaseClass
,我有几个派生类,比如Derived1
,Derived2
,Derived3
。我有几个操作只适用于一个特定的功能,即生成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操作,这将使我的界面更清晰。有没有办法这样做,以便我的派生类将被强制覆盖嵌套类及其所有方法?或者这只是一种愚蠢的方式来做这件事?
答案 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
继承的包含对象的引用