Возможно ли ООП и полностью избежать наследования реализации?

Я выберу Java в качестве примера, большинство людей это знают, хотя все остальные ОО-языки тоже работали.

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

Однако мой класс также может «наследовать» (не в терминах Java) просто интерфейс, без реализации. На самом деле интерфейсы действительно называются так в Java, они обеспечивают наследование интерфейса, но без наследования какой-либо реализации, так как все методы интерфейса не имеют реализации.

Теперь было этов статье говорится, что лучше наследовать интерфейсы, чем реализацииВы можете прочитать его (по крайней мере, в первой половине первой страницы), это довольно интересно. Это позволяет избежать таких проблем, какхрупкая проблема базового класса, Пока в этом много смысла, и многое другое, сказанное в статье, имеет для меня много смысла.

Что меня беспокоит, так это то, что наследование реализации означаетcode reuse, одно из самых важных свойств ОО языков. Теперь, если у Java нет классов (как, например, Джеймс Гослинг, крестный отец Java, согласно этой статье), это решает все проблемы наследования реализации, но как тогда сделать повторное использование кода возможным?

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

Как бы вы избежали этого, когда у вас есть интерфейсная машина и сто классов, что вам нужно реализовать идентичный метод move () для каждого из них? Какие концепции повторного использования кода, кроме наследования реализации, существуют в мире ОО?

В некоторых языках есть Mixins. Являются ли Mixins ответом на мой вопрос? Я читал о них, но я не могу себе представить, как Mixins будет работать в мире Java и смогут ли они действительно решить эту проблему здесь.

Другая идея заключалась в том, что существует класс, который реализует только интерфейс Car, давайте назовем его AbstractCar и реализует метод move (). Теперь другие автомобили также реализуют интерфейс Car, внутренне они создают экземпляр AbstractCar и реализуют свой собственный метод move (), вызывая move () на своем внутреннем абстрактном Car. Но разве это не будет напрасной тратой ресурсов (метод, вызывающий просто другой метод - хорошо, JIT может встроить код, но все же) и использующий дополнительную память для хранения внутренних объектов, вам даже не понадобится наследование реализации? (в конце концов, каждому объекту требуется больше памяти, чем просто сумма инкапсулированных данных). Также программисту неудобно писать фиктивные методы, такие как

public void move() {
    abstractCarObject.move();
}

?

Кто-нибудь может представить себе лучшую идею, как избежать наследования реализации и при этом иметь возможность повторно использовать код простым способом?

Ответы на вопрос(8)

Ваш ответ на вопрос