Ваш образ мышления понятен, вам просто нужно сделать еще один шаг вперед.
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 похожи на вложенные static
классы в Java тем, что у них нет ссылки на конкретный экземпляр содержащего класса, они просто сгруппированы, из-за отсутствия лучшего термина, по внешнему классу и имеют доступ для закрытых, защищенных и внутренних членов содержащего класса.
Предоставляя абстрактное свойство только для чтения, которое имеет тип абстрактного внутреннего класса, вы затем требуете, чтобы наследующий класс предоставлял НЕКОТОРЫЕ конкретные реализации этого и ломал ваши методы так, как вам нравится.
Редактировать
Несмотря на то, что абсолютно невозможно принудительно применить тот КАЖДЫЙ класс, который наследуется от BaseClass
, обеспечивает отличную реализацию класса PDFOperations
, это реализуется с практической точки зрения, поскольку любой класс, который наследует от 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
, которая представляет ссылку на содержащий объект, который наследуется от BaseClass