Skip to content

Instantly share code, notes, and snippets.

@danilobatistaqueiroz
Last active May 12, 2019 19:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danilobatistaqueiroz/cfd090d27229e360b28a82caa81ef404 to your computer and use it in GitHub Desktop.
Save danilobatistaqueiroz/cfd090d27229e360b28a82caa81ef404 to your computer and use it in GitHub Desktop.
Composition over Inheritance

Has-a over Is-a

A composição sobre herança (ou princípio de reutilização composto) na programação orientada a objeto (OOP)
é o princípio de que classes devem alcançar comportamento polimórfico e reutilização de código por sua composição
(contendo instâncias de outras classes que implementam a funcionalidade desejada) em vez de herança de um classe base ou pai.
Este é um princípio frequentemente afirmado de OOP, como no influente livro Design Patterns.

Composição é a forma mais forte de associação, o que significa que o(s) objeto(s) que compõem ou estão contidos
em um objeto são destruídos também quando esse objeto é destruído.

Exemplo

Herança

    class Vehicle {
        public String getDetails() {
            return "This is vehicle details";
        }
    }
    class Car extends Vehicle {
    }

Composition

    public VehicleDetails getDetails() {
        VehicleDetails vehicleDetails = new VehicleDetails();
        vehicleDetails.setDetails("This is vehicle details");
        return vehicleDetails;
    }
    class Car {
        Vehicle vehicle = new Vehicle();
        public String getDetails() {
            VehicleDetails vehicleDetails = vehicle.getDetails();
            return vehicleDetails.getDetails();
        }
    }

Note que no exemplo de Composition, se quisermos nos utilizar de Herança, o código da classe Car irá quebrar,
pois, ela espera uma String em getDetails.
Com a Herança, você é forçado a usar toda a interface da classe mãe, já com Composition você tem maior maleabilidade.

Além disso, a Herança pode introduzir alguns problemas de dependência entre as classes herdadas.

fontes:
https://www.baeldung.com/java-inheritance-composition
http://sudotutorials.com/tutorials/java/basics/java-composition.html
https://medium.com/@cscalfani/goodbye-object-oriented-programming-a59cda4c0e53

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment