abstractclass e interface são dois mecanismos na linguagem Java que suportam definições de classes abstratas. É precisamente por causa da existência desses dois mecanismos que Java recebe poderosos recursos orientados a objetos. Existem grandes semelhanças entre abstractclass e interface em termos de suporte para definição de classe abstrata, e elas podem até ser substituídas entre si. Portanto, muitos desenvolvedores parecem ser mais casuais quanto à escolha de abstractclass e interface ao definir classes abstratas. Na verdade, ainda há uma grande diferença entre os dois. A escolha deles reflete até mesmo a compreensão da natureza do domínio do problema e se a compreensão da intenção do design é correta e razoável. Este artigo analisará as diferenças entre eles e tentará fornecer aos desenvolvedores uma base para escolher entre os dois.
Entenda classes abstratas
Abstractclass e interface são usados para criar classes abstratas na linguagem Java (a classe abstrata neste artigo não é traduzida de abstractclass, ela representa um corpo abstrato, e abstractclass é um método usado para definir classes abstratas na linguagem Java), leitores preste atenção para distinguir) definição, então o que é uma classe abstrata e quais benefícios o uso de classes abstratas pode nos trazer?
No conceito orientado a objetos sabemos que todos os objetos são representados por classes, mas o inverso não é verdadeiro. Nem todas as classes são usadas para descrever objetos. Se uma classe não contém informações suficientes para descrever um objeto específico, tal classe é uma classe abstrata. Classes abstratas são frequentemente usadas para representar conceitos abstratos que derivamos da análise e do design de áreas problemáticas. Elas são abstrações de uma série de conceitos específicos que parecem diferentes, mas são essencialmente iguais. Por exemplo: Se desenvolvermos um software de edição gráfica, descobriremos que existem alguns conceitos específicos, como círculos e triângulos, no domínio do problema. Eles são diferentes, mas todos pertencem ao conceito de forma. no domínio do problema. Se existir, é um conceito abstrato. É precisamente porque os conceitos abstratos não possuem conceitos concretos correspondentes no domínio do problema, então as classes abstratas usadas para representar conceitos abstratos não podem ser instanciadas.
No campo orientado a objetos, as classes abstratas são usadas principalmente para ocultar tipos. Podemos construir uma descrição abstrata de um conjunto fixo de comportamentos, mas esse conjunto de comportamentos pode ter qualquer número de implementações concretas possíveis. Esta descrição abstrata é a classe abstrata, e este conjunto de quaisquer implementações concretas possíveis é representado por todas as classes derivadas possíveis. Os módulos podem operar em um corpo abstrato. Como um módulo depende de uma abstração fixa, ele não pode ser modificado ao mesmo tempo, o comportamento deste módulo também pode ser estendido derivando desta abstração; Os leitores familiarizados com OCP devem saber que, para realizar o OCP (Open-ClosedPrinciple), um dos princípios básicos do design orientado a objetos, as classes abstratas são a chave.
Olhando para abstractclass e interface a partir do nível de definição gramatical
No nível gramatical, a linguagem Java fornece definições diferentes para classe abstrata e interface. A seguir está um exemplo de definição de uma classe abstrata chamada Demo para ilustrar essa diferença.
A maneira de definir a classe abstrata Demo usando abstractclass é a seguinte:
Do ponto de vista da programação, tanto a classe abstrata quanto a interface podem ser usadas para implementar a ideia de "designbycontract". No entanto, ainda existem algumas diferenças no uso específico.
Em primeiro lugar, abstractclass representa um relacionamento de herança na linguagem Java, e uma classe só pode usar o relacionamento de herança uma vez. No entanto, uma classe pode implementar múltiplas interfaces. Talvez este seja um compromisso dos projetistas da linguagem Java ao considerar o suporte do Java para herança múltipla.
Em segundo lugar, na definição de abstractclass, podemos atribuir o comportamento padrão do método. Mas na definição de interface, os métodos não podem ter comportamento padrão. Para contornar essa restrição, devem ser usados delegados, mas isso adicionará alguma complexidade e às vezes causará muitos problemas.
Há outro problema sério em não ser capaz de definir o comportamento padrão em uma classe abstrata: isso pode causar problemas de manutenção. Porque se mais tarde você quiser modificar a interface da classe (geralmente representada por abstractclass ou interface) para se adaptar a novas situações (por exemplo, adicionar novos métodos ou adicionar novos parâmetros aos métodos existentes), será muito problemático e pode Leva muito tempo (especialmente quando há muitas classes derivadas). Mas se a interface for implementada por meio de abstractclass, talvez você só precise modificar o comportamento padrão definido em abstractclass.
Da mesma forma, se o comportamento padrão não puder ser definido em uma classe abstrata, a mesma implementação de método aparecerá em todas as classes derivadas da classe abstrata, violando o princípio “uma regra, um lugar”, resultando em duplicação de código, o que também não é propício para manutenção futura. Portanto, tenha muito cuidado ao escolher entre classe abstrata e interface.
Olhando para abstractclass e interface do ponto de vista dos conceitos de design, o texto acima discute principalmente as diferenças entre abstractclass e interface do ponto de vista da definição gramatical e da programação. Esta seção analisará a diferença entre abstractclass e interface em outro nível: os conceitos de design refletidos por ambos. O autor acredita que