Diferenças entre Herança X Classe Abstratas X Interfaces

Olá galera,

Todos já sabemos qual o significado de Herança, Classe Abstratas e Interfaces por esse motivo estou abrindo um topico para listarmos as DIFENÇAS entre esse conceitos da orientação a objetos.

Quais as diferenças entre Herança X Classe Abstratas X Interfaces? As experienças também são válidas e falicidades proporcionadas também vale!

Lembrando que o significado todos já sabemos!

Aguardo muitas respotas. vlw

Classes abstratas: classes que não podemos instanciar (na sua definição consta abstract class) e que define ao menos um método abstrato para que suas subclasses o implementem.

Interfaces: contratos. Usamos a palavra chama interface e o nível de acoplamento ao usar uma interface é menor que ao usar uma classe abstrata (no caso da interface interessa o que as implementações fazem, e não como).

Oiiii Pessoal

Herança, é uma classe herdar todos atributos e metodos visiveis em outra classe. EX:

public class pessoa
{
     private String nome;

        public String getNome() {
	return nome;
        }


public void setNome(String nome) {
	this.nome = nome;
      }

}

Depois irei criar uma classe Aluno, a perguta é: Aluno é uma Pessoa?

public class Aluno extends Pessoa()
{

//Então todos os atributos e Metodos da classes Pessoa agora estão disponiveis para serem usados na Aluno

}

Abraços

http://www.guj.com.br/posts/list/79093.java
http://www.guj.com.br/posts/list/131561.java
http://www.guj.com.br/posts/list/22989.java

[quote=marcobiscaro2112]Classes abstratas: classes que não podemos instanciar (na sua definição consta abstract class) e que define ao menos um método abstrato para que suas subclasses o implementem.
[/quote]

Cuidado, uma classe abstrata não força a existencia de um método abstrato. A classe pode ser abstrata tento apenas métodos concretos (não abstratos). O que nao pode acontecer é ter métodos abstratos e classe não ser abstrata.

O marcador “abstract” na classe significa “Esta classe não é instanciável” nada tem a haver com os métodos. A classe abstrata nem precisa sequer ter métodos.

[quote=gudamiao]Oiiii Pessoal

Herança, é uma classe herdar todos atributos e metodos visiveis em outra classe. EX:

[/quote]

Primeira regra para definir algo : não se usa o algo na definição. Herança é herdar ?

Herança não é isso. Herança é a classificação hierárquica de classes. Herança serve para classificar as classes.
No caso do Java, que apenas permite herança simples, a herança serve para classificar a identidade das classes. Ou seja, classificar o que elas são. Se aluno é uma pessoa, todos os alunos são pessoas. é esta a implicação da herança, estabelecer uma relação de É-UM.
Por exemplo, é mentira que todos os alunos são pessoas. Animais também podem aprender e seu alunos. Um modelo onde Aluno é uma Pessoa, não consegue classificar um aluno animal.

Quando uma classe herda de outra, isso cria um escopo de visibilidade entre as duas classes. Esse escopo é usadado para que a implementação seja coerente. Ou seja, a visibilidade e acesso dos métodos e atributos entre as classes pais e filhas não é a herança, é um efeito secundário decorrente da relação de herança.

[quote=marcobiscaro2112]
Interfaces: contratos. Usamos a palavra chama interface e o nível de acoplamento ao usar uma interface é menor que ao usar uma classe abstrata (no caso da interface interessa o que as implementações fazem, e não como).[/quote]

O que é acoplamento pra vc?
Me explique oq difere os itens abaixo em relação ao acoplamento!

abstract class A {
     abstract void m1();
     abstract void m2();
}

e

interface A {
    void m1();
    void m2();
}

Boa Tarde sergiotaborda

Legal, entendi perfeitamente, so me tira uma duvida!!!

Você disse que não é verdade, que o aluno é uma pessoa!!

Como projetaria um diagrama de classes, para uma Escola de Crianças, onde nao tem animal?

Como ficaria a herança da mesma?
att
Gustavo

[quote=gudamiao]Boa Tarde sergiotaborda

Legal, entendi perfeitamente, so me tira uma duvida!!!

Você disse que não é verdade, que o aluno é uma pessoa!!

Como projetaria um diagrama de classes, para uma Escola de Crianças, onde nao tem animal?

Como ficaria a herança da mesma?
[/quote]

Não ficaria. Aluno não é uma pessoa, a pessoa que pode ser aluno.
eu faria uma composição em que aluno tem uma pessoa - se a pessoa é realmente importante para o modelo. Se não, simplesmente não colocaria pessoa no modelo. Não usaria herança.

[quote=sergiotaborda][quote=gudamiao]Boa Tarde sergiotaborda

Legal, entendi perfeitamente, so me tira uma duvida!!!

Você disse que não é verdade, que o aluno é uma pessoa!!

Como projetaria um diagrama de classes, para uma Escola de Crianças, onde nao tem animal?

Como ficaria a herança da mesma?
[/quote]

Não ficaria. Aluno não é uma pessoa, a pessoa que pode ser aluno.
eu faria uma composição em que aluno tem uma pessoa - se a pessoa é realmente importante para o modelo. Se não, simplesmente não colocaria pessoa no modelo. Não usaria herança.
[/quote]

Nesse caso pelo que entendi você analisou o modelo de cima (Pessoa) para baixo (Aluno), quando afirmou que uma pessoa pode ser um aluno… achei interessante essa análise.

É para esse caso que servem as interfaces.

Tanto a classe Cachorro quanto a classe Aluno poderiam implementar a interface “Learnable” dando a capacidade de aprender as duas classes.
Assim, o aluno poderia continuar sendo uma pessoa e realizar tarefas de aluno e o cachorro poderia ter a capacidade de aprender. Caso essa fosse a ideia.

Boa Noite

Legal a melhor solução também acho que a interface serial legal!!!

att
Gustavo Damião

A discursão é bem interessante mas… precisamos nos focar nos objetico do tópico. Quais são as direnças existentes entre Herança X Classe Abstratas X Interfaces

Esse fator que torna o tópico importante.

SDS

Ola,

Heranca eh um dos pilares da orientacao a objetos, segundo a literatura (Heranca, polimorfismo, abstracao e encapsulamento). Heranca eh uma ferramenta que essas linguagens O-O te dao para te ajudar na modelagem. Utilizando-se a modelagem por heranca, ou seja, definindo seu modelo hierarquicamente, obtem-se clareza na modelagem (eh muito facil ler um modelo de classes bem projetado utilizando Heranca) e forte reutilizacao de codigo (ja que as classes filhas herdam codigo e definicoes das classes pai, evitando a reescrita de muito codigo). Por outro lado, voce ganha forte acoplamento – qualquer alteracao que voce porventura tenha que fazer nas classes pai (imagine seu sistema com muitos niveis de heranca) reflete em tooooodos que extendem daquela classe. DEpendendo do tamanho do sistema isso pode ser catastrofico. ALem do mais, a heranca em determinados casos quebra o encapsulamento – por muitas vezes, para reescrever um metodo com eficiencia em uma classe filha eh necessario conhecer detalhes da implementacao do metodo pai.

Classes Abstratas sao classes utilizadas na modelagem baseada em heranca. Sao classes que representam conceitos abstratos, genericos que nao fazem sentido serem instanciados no seu sistema e estao ali visando reutilizacao de codigo, reunindo caracteristicas que sao comuns a todos os que vao herdar dessa classe. Por exemplo… suponha a classe abstrata Motor – que tera os atributos basicos de um motor: potencia, torque, cilindros, valvulas… e os metodos ligar() e desligar().

Provavelmente voce ira definir os metodos ligar() e desligar() como abstratos. Por que? Sua classe concreta MotorCarro tem o ligar() de um jeito, sua classe concreta MotorMOto tem o ligar() de outro jeito, sua classe MotorAviao tem outro ligar(). Idem para o desligar(). Deu pra sacar? Voce esta delineando mais ou menos o seguinte: olha, no meu modelo, pra ser um motor voce deve herdar de Motor e implementar os metodos abstratos (o compilador te forca a isso). Se algum metodo for comum atodos, voce pode defini-lo na classe abstrata (seria o metodo concreto), com codigo dentro. Dai, todos que herdarem dessa classe abstrata herdadao o codigo. Como eh baseado em heranca, tem os pros e contras da mesma.

Interfaces dizem respeito a outra forma de modelar - a composicao, que eh uma alternativa a heranca. Uma interface eh basicamente o seguinte: nao tem codigo nenhum dentro, apenas atributos e assinaturas de metodos.

Meio confuso, ne ? Com composicao voce nao tem a reutilizacao de codigo – interfaces apenas definem assinaturas de metodos. SUponha o mesmo exemplo de motor – seria identico. Todas as classes que quiserem ser um Motor no modelo terao de implementar a interface motor.

public interface Motor {
	
	public Integer valvulas = 16;
	
	public void ligar();
	
	public void desligar();

}

Supondo que todos os nossos motores terao 16 valvulas (esse valor pode ser sobrescrito nas classes que implementam a interface). Entao, como dizia, toda classe que quiser ser um Motor (MOtorCarro, MotorMoto etc…) tera de implementar a interface, respeitando a definicao dos metodos na interface.

Qual a diferenca, entao ?

COmo disse, sao 2 formas de modelar – com suas vantagens e desvantagens. O uso de interfaces nao produz o problema de quebra de encapsulamento visto que as implementacoes nao herdam nada de classes-mae, porem nao tem a reutilizacao do codigo com a facilidade que a heranca da. Basicamente, uma interface define um comportamento 100% abstrato, deixando a responsabilidade da implementacao total para o programador.

Se ficou confuso, basta dizer que tento explicar melhor.

Abs!!

Olás,
Meio q desenterrando o tópico, gostaria de colocar algumas conclusões de tudo que foi lido pra ver se estamos de acordo:

  1. Usamos classe abstrata no lugar de uma interface quando queremos obter o benefício da herança, isto é, além da subclasse ser forçada a implementar os métodos abstratos da classe pai (como seria numa interface), pode contar com o reaproveitamento de código da classe pai, por meio de algum método não abstrato implementado.

  2. A vantagem da interface (dependendo do caso) é que uma classe pode implementar mais de uma, diferente de herdar uma classe abstrata, onde só se pode fazer uma vez.

Agora sobre instanciar essas abstrações, é possível (ou aparentemente, se não há algo ‘por trás dos panos’) com interface mas não com classe abstrata, ex:

List arr = new ArrayList();

confere?

abs

1 curtida

Você pode usar a classe abstrata sozinha ou combiná-la com uma interface – dessa forma você define o seu tipo na interface e implementa o “basicão”, os métodos que serão reaproveitados em uma classe abstrata. Dessa forma as classes concretas já vão herdar o que é comum (se fosse só a interface voce teria que implementar o mesmo método em todas as classes concretas). Isso, porém, é uma abordagem. Eu acho bem razoável, mas tem gente que nao concorda…

Essa é uma grande vantagem das interfaces também, ja que no Java a herança é simples. Além disso, você não fica acoplado fortemente com a herança, no caso das classes abstratas. Claro que tudo é uma questão de avaliar e ser razoável… na propria API do Java muita coisa é definida em interfaces, que são implementadas parcialmente por classes abstratas. A partir daí as classes concretas simplesmente herdam da classe abstrata o que é comum a todas (em geral a herança tem poucos níveis, um ou no maximo dois) e implementa os métodos específicos a cada uma.

Cara, nao existe instanciar abstração. Você NUNCA vai instanciar diretamente uma interface ou uma classe abstrata. Note que voce esta instanciando um ArrayList (new ArrayList)… voce esta APONTANDO uma referencia de List para essa instancia, simplesmente uma referencia. Procure ler mais sobre o assunto…

Abs