Recentemente, comecei a entender o OOP e agora estou no ponto em que quanto mais leio sobre as diferenças entre classes abstratas e interfaces, mais confuso fico. Até agora, nenhum dos dois pode ser instanciado. As interfaces são mais ou menos projetos estruturais que determinam o esqueleto e os resumos são diferentes ao poder implementar parcialmente o código.
Gostaria de aprender mais sobre isso através da minha situação específica. Aqui está um link para minha primeira pergunta, se você quiser um pouco mais de informações básicas: Qual é um bom modelo de design para minha nova classe?
Aqui estão duas classes que eu criei:
class Ad {
$title;
$description
$price;
function get_data($website){ }
function validate_price(){ }
}
class calendar_event {
$title;
$description
$start_date;
function get_data($website){ //guts }
function validate_dates(){ //guts }
}
Então, como você pode ver, essas classes são quase idênticas. Não é mostrado aqui, mas há outras funções, like get_zip()
, save_to_database()
que são comuns em minhas aulas. Também adicionei outras classes de carros e animais de estimação que possuem todos os métodos comuns e, claro, propriedades específicas para essas classes (quilometragem, peso, por exemplo).
Agora, violei o princípio DRY e estou gerenciando e alterando o mesmo código em vários arquivos. Pretendo ter mais aulas, como barcos, cavalos ou o que for.
Então é aqui que eu usaria uma interface ou uma classe abstrata? Pelo que entendi sobre classes abstratas, eu usaria uma superclasse como um modelo com todos os elementos comuns incorporados à classe abstrata e, em seguida, adicionaria apenas os itens especificamente necessários em futuras classes. Por exemplo:
abstract class content {
$title;
$description
function get_data($website){ }
function common_function2() { }
function common_function3() { }
}
class calendar_event extends content {
$start_date;
function validate_dates(){ }
}
Ou eu usaria uma interface e, por serem tão semelhantes, criaria uma estrutura que cada uma das subclasses é forçada a usar por motivos de integridade e deixaria ao desenvolvedor final que criar essa classe o responsável por cada um dos detalhes até das funções comuns. Na minha opinião, é possível que algumas funções "comuns" precisem ser aprimoradas no futuro para atender às necessidades de sua classe específica.
Apesar de tudo isso acima, se você acredita que estou entendendo errado o que e o porquê das classes e interfaces abstratas, deixe uma resposta válida parar de pensar nessa direção e sugerir a maneira correta de avançar!
Obrigado!