Один из подходов состоит в том, чтобы иметь защищенный переопределяемый метод, а затем иметь общедоступный не переопределяемый метод, который вызывает переопределяемый. Каждый раз, когда возвращаемое значение для функции в производном классе должно измениться, переопределение notoverridable переопределяемого метода вызывает новый переопределяемый метод, который возвращает более уточненный тип, а также скрывает более раннюю версию публичной функции с той, которая использует новое переопределение. Если бы vb.net позволял одному классу переопределять и скрывать одного и того же члена, все было бы намного чище, но сделать это невозможно.
Public Class CarFactory
Protected Overridable Function DerivedMakeCar() as Car
' make a car
End Function
Public Function MakeCar() as Car
Return DerivedMakeCar()
End Function
End Class
Public Class FordFactory
Inherits CarFactory
Protected Overrides Function DerivedMakeCar() As Car
Return DerivedMakeFord()
End Function
Protected Overridable Function DerivedMakeFord() As Ford
' Make a Ford
End Function
Public Shadows Function MakeCar() As Ford
Return DerivedMakeFord()
End Function
End Class
В некоторых случаях более простой альтернативой может быть использование общедоступной переопределяемой функции MakeCar (), которая всегда возвращает объект типа Car
, но в FordFactory также имеется функция MakeFord (), которая возвращает Ford.
Переопределенная функция MakeCar () будет NotOverridable
и будет просто вызывать MakeFord. В некотором смысле последний подход может быть чище, но если существует общее соглашение об именах (например, на фабриках есть метод MakeProduct, который возвращает наиболее производный тип), может быть полезно использовать тени.