Является ли хорошей практикой программирования OO для создания метода в базовом классе, который знал бы о производном классе?Должен ли базовый класс содержать метод, который ссылается на производный класс?
Например, рассмотрим классы A, B, C, D, где класс B наследует от A, а классы C и D наследуют от B. Рассмотрим теперь метод, который является общим для всех классов, которые наследуются от A (включая сам A) и который должен знать о классе B для работы (например: относительное расстояние объектов класса A/B/C/или D от объекта B). Поскольку этот метод является общим для всех классов (A, B, C, D), он звучит логично, что он должен быть помещен в класс A. Однако в этом случае у нас будет метод в базовом классе, который «знал» о производном класс.
Пример:
Class A {
# simple coordinate system
distance_to_complex_coordinate_system (B complexCoord) {
return complexCoord.distance_to_simple_coord_system(self)
}
}
Class B extends A {
# complex coordinate system
distance_to_simple_coordinate_system (simpleCoord) {
# do calculations
}
}
Class C extends A {}
Class D extends A {}
...
В приведенном выше примере distance_to_complex_coordinate_system
представляет собой метод, который все простые системы (а именно: A, B, C, и D) координат должны иметь и выполнение точно так же для всех из них , Это не абстрактный класс, и поэтому его нельзя переопределять.
Означает ли это смысл в точке зрения ОО, и если это действительно так, это хорошая практика программирования? Если нет, любые предложения о том, как избежать этого, будут высоко оценены.
С моей точки зрения, это не очень хорошая практика, но я не могу найти хороший способ избежать этого без излишне дублирующего кода. btw хотя, вероятно, неважно - я использую Perl.
вы говорите, что «реализация точно так же для всех них», которая заставляет меня верить, что 'A' знает все, что необходимо знать для того, чтобы вычислить значение для' distance_to_simple_coord_system() '. Вы изначально заявили, что «A» должны знать о реализации в «B», но это не похоже на случай после вашего разъяснения. Я подозреваю, что ваши подклассы будут иметь несколько разные реализации 'distance_to_simple_coordinate_system()' иначе зачем переопределять этот метод? – Brad
'distance_to_simple_coord_system' - это метод класса B, и только этот класс знает, как его вычислить. Класс A и все другие классы должны знать, что класс B существует, и поэтому используйте 'distance_to_complex_coordinate_system' – mns
Я не хочу переопределять' distance_to_simple_coordinate_system', этот метод существует только в классе B и нигде больше.Проблема заключается в 'distance_to_complex_coordinate_system', который должен знать, что класс B существует. – mns