Дизайн Java: добавление общих функций к классам, которые расширяют один и тот же базовый класс, без изменения базового класса.

Я пытаюсь понять, как лучше всего решить эту проблему в проекте, над которым я работаю. Приведу аналогию задачи:

Есть класс Автомобиль. Из Car я создаю 3 расширяющих его класса:

  • Лимузин удлиняет автомобиль
  • Грузовик удлиняет Автомобиль
  • Автобус удлиняет автомобиль

Теперь предположим, что я понимаю, что кто-то забыл включить метод getSpeed() в класс Car, и мне нужно его добавить. Но я не могу каким-либо образом изменить класс Car, а 3 класса должны расширять Car. Как мне лучше всего добавить общую функциональность к этим 3 классам без необходимости копировать и вставлять код туда и обратно? Реализация метода getSpeed() одинакова для каждого класса, поэтому я хотел бы что-то вроде абстрактного класса, но при этом иметь возможность сохранять классы как расширение Car.

Это пример моего единственного способа обойти это до сих пор, но мне любопытно, есть ли лучший способ:

public class Limo extends Car {
    CarSpeed cs;
    public Limo() {
        cs = new CarSpeed(this);
    }
}

и иметь класс CarSpeed, содержащий фактический метод getSpeed().

Есть ли более чистый способ сделать это, о котором я не знаю? Я также могу работать только на Java 7, поэтому я не думаю, что могу использовать ключевое слово по умолчанию (не то, чтобы я прочитал его достаточно, чтобы знать, применимо ли оно к этой ситуации: ()


person rococo    schedule 16.02.2016    source источник
comment
Могу я спросить, почему вы не можете добавить getSpeed() в Car? Весь смысл наследования состоит в том, чтобы принять определенные черты родительского/базового класса.   -  person ryekayo    schedule 17.02.2016
comment
Это часть файла jar, который я не могу удобно перекомпилировать :(   -  person rococo    schedule 17.02.2016
comment
Угу. Хммм .... так что в основном вы импортируете библиотеку, тогда правильно?   -  person ryekayo    schedule 17.02.2016
comment
Да, в основном я вижу исходный код Car, но не могу использовать модифицированную версию без особых проблем.   -  person rococo    schedule 17.02.2016
comment
Хорошо, я ненавижу это говорить, и я знаю, что вы не хотите копировать/вставлять, но, возможно, использование интерфейса не будет таким плохим решением.   -  person ryekayo    schedule 17.02.2016


Ответы (1)


Есть два возможных способа сделать это:

  1. Добавьте getSpeed() в класс Car, чтобы другие классы могли наследовать этот метод. Это, вероятно, лучший способ, поскольку он следует ООП.

  2. Создайте интерфейс и добавьте к нему getSpeed(). Единственное, что другие классы, такие как Limo, Truck и Bus, должны будут создать тело getSpeed() при реализации интерфейса.

person ryekayo    schedule 16.02.2016