Quando implementar e estender? [fechadas]

91
  • Quando deve implementou extendser usado?
  • Quais são alguns exemplos do mundo real?

Isso está correto?

A implementação parece ser uma forma de garantir que certos métodos existam em uma classe e que essas chamadas de função de métodos sejam formatadas corretamente. Implementar não é uma forma de passar variáveis ​​ou "configurações" para a classe?

Cenário da vida real esperado: Tenho uma plataforma de e-commerce com várias classes de pagamento que seguem o mesmo design. Quando uma nova classe de pagamento deve ser adicionada, é realmente fácil seguir o design definido do interfacepara garantir que todos os bits e peças estejam lá, desde o início.

Estender classes faz com que a classe estendida (filha?) Herde tudo de sua classe pai, exceto métodos e variáveis ​​declarados como private?

Cenário da vida real esperado: tenho uma classe chamada sessionscom duas classes filhas chamadas sessioncookiese databasesessions. sessioncookiese databasesessions, juntos, herdam várias opções de configuração mútuas de suas sessões pai, tornando mais fácil alterar uma opção de configuração para afetar todos os tipos de armazenamento de dados do visitante.

Industrial
fonte
1
Eu recomendo que você leia sobre herança.
Rafe Kettler

Respostas:

64

A herança é útil para reduzir a quantidade de código que você reescreve. Se você tiver várias classes com alguns métodos ou campos comuns, em vez de definir esses métodos e campos repetidamente, você pode fatorá-los em uma classe base e fazer com que cada uma das classes filhas estenda essa classe base.

As interfaces (e implements) são úteis quando você deseja definir um protocolo comum para como um grupo de objetos deve se comportar. Por exemplo, você pode exigir que objetos comparáveis ​​possam ser comparados quanto à igualdade e hash, etc.

O uso de herança é basicamente uma escolha de design. Fique atento a casos em que você define os mesmos métodos em várias classes; esses são casos excelentes em que você pode fatorar esses métodos em uma classe base. O mesmo vale para classes que observam algumas das mesmas características: você pode garantir consistência colocando essas características em uma interface a ser implementada por essas classes relacionadas.

Herança é um grande conceito em OOP que vai muito além de apenas PHP. Eu recomendo que você leia o artigo da Wikipedia sobre herança e talvez Design Patterns da Gang of Four .

Acredito que seu entendimento sobre herança esteja correto. O próximo passo seria usá-lo na produção.

Rafe Kettler
fonte
4
Muitas pessoas agora consideram o livro The Gang of Four muito pesado em termos de material como uma introdução aos padrões de projeto. Uma alternativa popular é Use a Cabeça: Padrões de Design, que torna a leitura mais leve. amazon.co.uk/Head-First-Design-Patterns-Freeman/dp/0596007124
Bendihossan
1
"Fique atento aos casos em que você define os mesmos métodos em várias classes; esses são casos excelentes em que você pode fatorar esses métodos em uma classe base." Estender uma Classe teria um benefício em relação ao uso de uma Característica para definir esses métodos?
Daniel Weiner
1
"A herança é útil para reduzir a quantidade de código que você reescreve" - ​​O objetivo da herança é compartilhar o comportamento, não o código. Sempre que possível, os traços são a forma de compartilhar código, em vez de estender uma classe abstrata com classes concretas que, de outra forma, nada têm em comum. Geralmente, você também pode modelar suas classes como relacionamentos tem-um em vez de é-um, o que facilitará ainda mais a reutilização de código e o polimorfismo.
Duncan
14

Implemento:

As interfaces são classes abstratas, então você só pode declarar coisas. Uma classe implementa uma interface. Você pode implementar várias interfaces.

Ampliar:

Você estende as classes quando deseja uma versão mais específica de uma classe.

Exemplo:

// Contract: a pet should play
public interface Pet {
    public void play(); 
}

// An animal eats and sleeps
class Animal {
    public void eat();
    public void sleep();
}


public class Camel extends Animal {

}

public class Dog extends Animal implements Pet {    
    public void play() {...}
}

Tanto o Camelo quanto o Cachorro são animais, então eles estendem a Animalclasse. Mas apenas o Cachorro é um tipo específico de Animalque também pode ser umPet

Ahmad Mobaraki
fonte