Как моделировать (под)классы с идентичными атрибутами и методами?
Я пытаюсь смоделировать следующую ситуацию в Java, но я полагаю, что это может быть общая проблема ООП: у меня есть 3 (или, может быть, больше) разных класса, которые имеют некоторые общие атрибуты и методы, а также некоторые атрибуты и методы, которые являются специфическими. к каждому из классов.
Пока это классическая ситуация наследования.
Проблема: Третий класс содержит некоторые атрибуты/методы, идентичные (только) первому классу, и некоторые идентичные (только) второму классу. Также следует использовать полиморфизм.
Чтобы быть более конкретным: я хочу смоделировать станции, где люди могут брать вещи: естьBikeStations
,CanoeStations
иBikeAndCanoeStations
, с одним или несколькими общими методами поведения (для полиморфизма).
Поскольку, на первый взгляд, это классическая проблема наследования, можно смоделировать классы следующим образом:
// Superclass (Station)
public abstract class Station {
// common attributes
// common methods
public abstract void doSomething();
}
// Subclass 1 (BikeStation)
public class BikeStation extends Station {
private int someBikeSpecificAttribute;
// more bike station specific attributes
public void doSomething() {
// bike station specific stuff
}
// more bike station specific methods
}
// Subclass 2 (CanoeStation)
public class CanoeStation extends Station {
private int someCanoeSpecificAttribute;
// more canoe station specific attributes
public void doSomething() {
// canoe station specific stuff
}
// more canoe station specific methods
}
// Subclass 3 (BikeAndCanoeStation)
public class BikeAndCanoeStation extends Station {
private int someBikeSpecificAttribute; // same as in BikeStation
private int someCanoeSpecificAttribute; // same as in CanoeStation
// more mixed station specific attributes
public void doSomething() {
// bike station specific stuff (same as in BikeStation)
// canoe station specific stuff (same as in CanoeStation)
}
// more mixed station specific methods
}
Однако было бы неправильно просто копировать атрибуты и методы/инструкции из первых двух классов в третий. Это просто не похоже на хорошее ООП. Это создает избыточный код, и я не могу легко добавить другие классы (станции) позже.
Поэтому я подумал об использовании интерфейсов или даже шаблона стратегии , но это решает только поведенческую проблему (то есть методы), если вообще решает.
Как бы вы смоделировали такую ситуацию с хорошим ООП (желательно на Java)?
(отредактированный вопрос, чтобы включить/уточнить использование полиморфизма.)