A OOP e a implementação completa da herança são possíveis?

Escolherei o Java como um exemplo, a maioria das pessoas sabe disso, embora todas as outras linguagens OO estivessem funcionando também.

Java, como muitas outras linguagens, possui herança de interface e herança de implementação. Por exemplo. uma classe Java pode herdar de outra e todo método que tem uma implementação lá (assumindo que o pai não é abstrato) também é herdado. Isso significa que a interface é herdada e a implementação para esse método também. Eu posso sobrescrever, mas não preciso. Se eu não sobrescrevê-lo, eu herdei a implementação.

No entanto, minha classe também pode "herdar" (não em termos Java) apenas uma interface, sem implementação. Na verdade, as interfaces são realmente nomeadas dessa maneira em Java, elas fornecem herança de interface, mas sem herdar qualquer implementação, já que todos os métodos de uma interface não têm implementação.

Agora havia esseartigo, dizendo que é melhor herdar interfaces do que implementações, você pode gostar de ler (pelo menos a primeira metade da primeira página), é bem interessante. Evita problemas como oproblema de classe base frágil. Até agora isso faz todo o sentido e muitas outras coisas ditas no artigo fazem muito sentido para mim.

O que me incomoda sobre isso, é que meios de herança de implementaçãoreutilização de código, uma das propriedades mais importantes das linguagens OO. Agora, se Java não teve classes (como James Gosling, o padrinho de Java desejou de acordo com este artigo), ele resolve todos os problemas de herança de implementação, mas como você tornaria a reutilização de código possível?

Por exemplo. se eu tiver uma classe Car and Car, tem um método move (), que faz o movimento do carro. Agora eu posso subclassificar Car para diferentes tipos de carros, que são todos carros, mas são todas versões especializadas do Car. Alguns podem se mover de uma maneira diferente, estes precisam sobrescrever move () de qualquer maneira, mas a maioria simplesmente manteria o movimento herdado, já que eles se movem da mesma forma que o carro pai abstrato. Agora suponha por um segundo que existem apenas interfaces em Java, somente interfaces podem herdar umas das outras, uma classe pode implementar interfaces, mas todas as classes são sempre finais, então nenhuma classe pode herdar de qualquer outra classe.

Como você evitaria que, quando tivesse uma Interface Car e cem classes Car, fosse necessário implementar um método move () idêntico para cada uma delas? Quais conceitos de reutilização de código além da herança de implementação existem no mundo OO?

Algumas linguagens possuem Mixins. Mixins é a resposta para minha pergunta? Eu li sobre eles, mas não consigo imaginar como o Mixins funcionaria em um mundo Java e se eles podem realmente resolver o problema aqui.

Outra ideia é que existe uma classe que apenas implementa a interface Car, vamos chamar de AbstractCar, e implementa o método move (). Agora outros carros implementam a interface Car também, internamente eles criam uma instância de AbstractCar e implementam seu próprio método move () chamando move () em seu carro abstrato interno. Mas isso não seria desperdiçar recursos para nada (um método chamando apenas outro método - ok, JIT poderia embutir o código, mas ainda assim) e usar memória extra para manter objetos internos, você nem precisaria de herança de implementação? (afinal todo objeto precisa de mais memória do que apenas a soma dos dados encapsulados). Também não é estranho para um programador escrever métodos fictícios como

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

?

Alguém pode imaginar uma idéia melhor de como evitar a herança de implementação e ainda ser capaz de reutilizar o código de maneira fácil?

questionAnswers(8)

yourAnswerToTheQuestion