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

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

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

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

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

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

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

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

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

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

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

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

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

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