- Quando deve
implement
ouextend
ser 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 interface
para 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 sessions
com duas classes filhas chamadas sessioncookies
e databasesessions
. sessioncookies
e 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.
Respostas:
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.
fonte
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
Animal
classe. Mas apenas o Cachorro é um tipo específico deAnimal
que também pode ser umPet
fonte