Conheço a sintaxe, as regras aplicadas à classe abstrata e quero saber o uso de uma classe abstrata
A classe abstrata não pode ser instanciada diretamente, mas pode ser estendida por outra classe
Qual é a vantagem de fazer isso?
Como é diferente de uma interface?
Eu sei que uma classe pode implementar várias interfaces, mas só pode estender uma classe abstrata. Essa é a única diferença entre uma interface e uma classe abstrata?
Estou ciente do uso de uma interface. Aprendi isso com o modelo de delegação de eventos do AWT em Java.
Em quais situações devo declarar classe como uma classe abstrata? Quais são os benefícios disso?
java
object-oriented
abstract-class
Vaibhav Jani
fonte
fonte
Respostas:
Essa resposta explica bem as diferenças entre uma classe abstrata e uma interface, mas não responde por que você deve declarar uma.
Do ponto de vista puramente técnico, nunca há a exigência de declarar uma classe como abstrata.
Considere as três classes a seguir:
Você não precisa abstrair a classe Database, mesmo que exista um problema óbvio com a sua implementação: Ao escrever este programa, você poderia digitar
new Database()
e seria válido, mas nunca funcionaria.Independentemente disso, você ainda obteria polimorfismo; portanto, enquanto seu programa apenas cria
SqlDatabase
eOracleDatabase
instâncias, você pode escrever métodos como:As classes abstratas melhoram a situação impedindo que um desenvolvedor instancie a classe base, porque um desenvolvedor a marcou como tendo falta de funcionalidade . Ele também fornece segurança em tempo de compilação, para que você possa garantir que todas as classes que estendem sua classe abstrata forneçam a funcionalidade mínima necessária para o trabalho e não precise se preocupar em colocar métodos stub (como o acima) que os herdeiros de alguma forma tenham saber magicamente que eles precisam substituir um método para fazê-lo funcionar.
As interfaces são um tópico totalmente separado. Uma interface permite descrever quais operações podem ser executadas em um objeto. Você normalmente usaria interfaces ao escrever métodos, componentes etc. que usam os serviços de outros componentes, objetos, mas não se importa com o tipo de objeto real do qual está obtendo os serviços.
Considere o seguinte método:
Você não se importa se o
database
objeto é herdado de um objeto em particular, apenas se importa que ele tenha umaddProduct
método. Portanto, nesse caso, uma interface é mais adequada do que fazer com que todas as suas classes sejam herdadas da mesma classe base.Às vezes, a combinação dos dois funciona muito bem. Por exemplo:
Observe como alguns dos bancos de dados herdam do RemoteDatabase para compartilhar algumas funcionalidades (como conectar antes de escrever uma linha), mas o FileDatabase é uma classe separada que apenas implementa
IProductDatabase
.fonte
Semelhanças
Classes abstratas e interfaces são necessárias para a abstração. Eles não podem ser instanciados com um novo , mas podem ser resolvidos na inversão de contêineres de controle ou através de padrões de fábrica.
Diferença
Interfaces
Classe abstrata
Na verdade, é fácil encontrar a resposta através de uma simples consulta no Google .
fonte
Em uma classe abstrata, você pode implementar alguns métodos e deixar (forçar) o restante a ser implementado pela classe de extensão. Você não pode implementar métodos em uma interface. Você não pode forçar ninguém a substituir nada ao estender uma classe comum. Com uma classe abstrata, você pode.
fonte
As classes abstratas são para relacionamentos "is a" e as interfaces são para "pode fazer".
As classes abstratas permitem adicionar o comportamento base para que os programadores não precisem codificar tudo, enquanto os forçam a seguir seu design.
fonte
Além dos detalhes técnicos, como a implementação de alguns métodos para classes abstratas, etc., o significado é o seguinte:
Interfaces definem capacidade comum - IEnumerable define que a classe que implementa essa interface pode ser enumerada. Não diz nada sobre a classe em si.
As classes abstratas (ou básicas) definem o comportamento - o WebRequest define um comportamento comum de todas as classes filho, como HttpWebRequest, etc. Ele define o significado principal da classe e seu objetivo real - acessar recursos da Web.
fonte
Entrada da Wikipedia .
As principais diferenças entre uma interface e uma classe abstrata é que uma classe abstrata pode fornecer métodos implementados. Com interfaces, você só pode declarar métodos, escreva sua assinatura. Aqui está um exemplo de uma classe que estende uma classe abstrata que implementa duas interfaces: (java)
Neste exemplo, o MyAbstractClass fornece um método público que imprime todos os três valores. No ImpClass, você precisa implementar getValue1 e getValue2, respectivamente, de MyInterface1 e MyInterface2 e getValue3 da classe abstrata.
Voilà.
Existem mais aspectos (interface: apenas métodos públicos, classe abstrata: métodos abstratos protegidos e abstratos públicos), mas você pode ler isso por si mesmo.
Em uma nota final, uma classe abstrata que apenas fornece métodos abstratos é uma classe base abstrata "pura", também conhecida como interface.
fonte
Em outras palavras, você deve começar com uma pergunta: "essas classes necessariamente compartilham a implementação ou apenas têm uma interface comum ?"
Se a resposta for mista, como - essas três classes devem compartilhar a implementação, mas essas outras duas compartilham apenas sua API -, você poderá criar uma interface para todas as cinco e uma classe abstrata para as três com o mesmo código.
Também existem outras maneiras de compartilhar a implementação, por exemplo, encapsular um objeto com essa implementação (por exemplo, no padrão Estratégia ).
fonte
Você declararia um resumo de classe quando não quiser que o desenvolvedor (provavelmente você mesmo) possa instancia-lo, porque não funcionaria ou não faria sentido.
Por exemplo, considere um jogo em que existem diferentes tipos de entidades de jogo. Todos eles herdam da
GameEntity
classe base .Essa classe é declarada,
abstract
pois não faria sentido instancia-la. Ele declara algumas ações para as entidades do jogo e alguns atributos, mas em nenhum lugar nesta classe esses atributos são inicializados. Essa classe serve como modelo para as entidades do jogo, mas não deve ser instanciada por si própria e, como tal, declaradaabstract
.Em relação à diferença de uso entre uma classe abstrata e uma interface:
A meu ver, uma interface é uma maneira de obter comportamento polimórfico sem ser limitada pelo mecanismo de herança única de algumas linguagens.
Vamos voltar ao jogo como um exemplo. Considere uma classe
Enemy
que é derivadaGameEntity
. Essa classe tem um métodoattackMeFromDistance(RangedAttacker attacker)
. Este método destina-se a permitir que as entidades atacem o inimigo de longe.Como você pode ver, esse método usa um
RangedAttacker
tipo como parâmetro. No entanto, todas as entidades do jogo já herdamGameEntity
. Eles não podem estender outra classe.Tome as aulas
Mage
e,Archer
por exemplo. Queremos permitir que ambos sejam aceitos como parâmetros noattackMeFromDistance(RangedAttacker attacker)
método, mas eles já são derivadosGameEntity
.Para resolver isso, criamos uma nova interface:
Uma classe que implementa essa interface deve implementar o
attackFromDistance()
método e, portanto, é garantido que ele variou os recursos de ataque. Isso significa que oattackMeFromDistance
método agora pode aceitar com segurança as classes que implementam essa interface. Portanto, criarMage
eArcher
implementar essa interface resolve nosso problema.Para mim, esse é o poder das interfaces.
Então, para resumir, você usaria uma classe abstrata quando quiser ter uma classe base para algumas classes, mas não faria sentido instancia-la por si só (ou no caso em que ela tenha
abstract
métodos, isso deve ser implementado pelas subclasses e, nesse caso, o compilador o forçaria a criar a classeabstract
). Você usaria uma interface para obter um comportamento polimórfico sem ser limitado pelo mecanismo de herança única.fonte
fonte