Em uma das minhas entrevistas de emprego

galera…
em uma das minhas entrevistas de emprego, me foi feita a seguinte pergunta:

“Qual a diferença arquitetural entre uma classe abstrata e uma interface?”

me enrolei todo pra responder mas nao saiu nada que preste…
não consegui me expressar!

então eu queria torcar idéias sobre qual seria a respota

alguém?!


Se vc tivesse estudado a apostila do Guj tinha sido contratado

acho que o amigo não entendeu…
o negócio é que não soube explicar exatamente com minha palavras!
a questão não foi eu não saber…
foi como formular uma boa resposta!

Bom, ai fica difícil.
Tipo, vou te dar umas dicas.
a entrevista de emprego é como o ramo de programação.
Voce pode saber muitu, mas saber e fazer é diferente.
Por isso o mercado de software procura pessoas experientes, com ou sem graduação,
o que importa é que voce sabe se expressar, trabalhar em equipe, se adaptar as necessidades.
Numa entrevista, voce pode saber o que é, mas se você não sabe explicar significa que voce não é tão bom na prática.
Não estou falando por mim isso, estou falando pelos empresarios.
Como por exemplo, voce explicaria seus procedimentos para os seus colegas de equipe.
Apesar de nós programarmos no computador, Dicção e Oratória são muitu necessários no nosso ramo.
Talvez você poderia ter se preparado melhor para a entrevista de emprego.
é só uma sujestão.
Mostre que você sabe fazer e faça acontecer.

valew pela dica mas enquanto a resposta?!
kd?

Sabe le a apostila não --’’

Tanto a Classe Abstrata como a Interface são “projetos” de classes e não podem ser instanciadas diretamente, só que a diferença entre elas é que na Classe Abstrata o programador do “projeto” pode definir o funcionamento de algumas funções, enquanto que na interface o programador só define as assinaturas.

Ex de Classe Abstrata

public abstract class ClasseAbstrata { //definição da assinatura, sem implementação public int calculaNumero(){ } //definição da assinatura, com implementação public boolean retornaFalse (){ return false; } }

Ex de Interface

public interface TesteInterface {
  public void algumaCoisa(){
  } 

  public boolean algumaCoisa2(){
  }
}

Como você pode perceber, eu defini a implementação de uma das funções da minha classe abstrata (a quantidade de funções implementadas eu decido) enquanto que na interface eu não defini nada além das assinaturas de funções (na interface eu só posso fazer isso).
Para instanciar uma classe abstrata ou uma interface você deve criar uma classe que extende uma classe abstrata ou implementa uma interface, em ambos os casos você terá de definir o conteúdo das funções só que a diferença é que no caso da classe abstrata, se você sabe que determinada função foi implementada você pode deixar ela como está, ou utiliza-la em outra parte do código assim:

Ex de Classe que extende uma Classe Abstrata
CODE

[code]public class ExtensaoClasseAbstrata extends ClasseAbstrata{

public int calculaNumero(){
/Código aqui/
}

public boolean retornaFalso(){
// através do comando super(nomeMétodo) eu estou utilizando a implementação de um método da classe mãe (no caso a classe abstrata)
return super(retornaFalso());
}
}[/code]

Ex de Classe que implementa uma Interface

[code]public class ImplementaInterface implements TesteInterFace{

public void algumaCoisa(){
/*Código aqui*/
} 

public boolean algumaCoisa2(){
/Código aqui/
}
}[/code]

Resumindo: Na classe abstrata, quem for implementar ela não é obrigado a implementar todos os métodos enquanto que na interface o programador é (mesmo que ele deixe a função em branco será contado como uma implementação).

Uma interface permite declarar a assinatura dos métodos que uma implementação deve oferecer, mas não permite declarar o corpo dos métodos. Já uma classe abstrata permite declarar não apenas a assinatura dos métodos que uma implementação deve oferecer (métodos esses que devem ser marcados com a palavra-chave abstract), como também declarar o corpo de outros métodos.

outro ponto é o fato de uma classe poder Implementar quantas interfaces quiser mas só pode Extender uma classe Abstrata apenas

Em uma das minhas entrevistas de emprego…

Eu estava começando na área de informática, e tinha um teste pesicológico.

Nesse teste o psicólogo me perguntou:

S do perdigão é vermelho ou preto ?”

respondi:

“Vermelho!”

Psicólogo:

“Bom, perdigão não tem S, quem tem é Sadia, e além do mais S da Sadia é preto…”

Resultado: Não fui contratado.

:smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley:

hum…
me desculpe aih por não ter lido!
mas cara…
era isso que tava na minha cabeça…
oq me confundiu foi a frase “diferença arquitetural” por que ele pode ter feito referencia a arquitetura da liguagem ou no arquitetura de um projeto
o que acha?
ou eu to falando bobagem?

Não. Vc nao ta falando bobagem…
Talvez o próprio entrevistador quis falar bonito e acabou se enrolando também.
Mas não estressa cara, vc consegue coisa melhor ^^

Cara interface eu não sei te explicar, mais classe abstrata posso te dizer.

A classe abistrata é algo do tipo uma classe para todos que vc vai usar como herança para alguma coisa.

O exemplo que meu professor me falou foi o seguinte.

Imagine uma classe chamada animal, com o campo som;

Note que todo animal tem um som;

Então vc poderia criar um cachorro e pedir para ele emitir um som entendi:

Em uma classe não abistrata vc criaria uma classe cachorro e pedisse para ele latir.

EM uma classe abstrata é algo genérico que pode ser usado por todos.

Olá galera…

O termo “diferença arquitetural” pode ter sido usado no contexto de arquitetura de sw.
Aconselho a darem uma pesquisada sobre reuso, acoplamento e coesão (conceitos básicos, mas nem tanto).

Respondendo a pergunta…

Muitos falam que os frameworks atuais usam @anottantion e que isso traz menos acoplamento… etc…

Por que? Eh bom dah uma pesquisada também… rsrsrs

Agora um ponto chave da pergunta é que uma interface traz menos acoplamento do que uma classe abstrata.

Por que? :slight_smile:

“it’s not what you know, it’s when you know it”

Sábia frase do livro do SCJP. :lol:

[quote=Marlon Meneses]galera…
em uma das minhas entrevistas de emprego, me foi feita a seguinte pergunta:

“Qual a diferença arquitetural entre uma classe abstrata e uma interface?”

me enrolei todo pra responder mas nao saiu nada que preste…
não consegui me expressar!

então eu queria torcar idéias sobre qual seria a respota

alguém?![/quote]
Velho,

Ficou óbvio que ele não queria conceitos, ele não queria que você falasse conceitos de interface e nem de classe abstrata, ele já foi um ponto acima, considerando que você tinha o conceito dos dois.

Não sei ao certo[não estava lá], mas parece a questão levantada pelo Gof: Herança X Composição.

Eu responderia(não precisamente assim) :idea: que classe abstrata define, através da herança, uma interface comum para suas subclasses e interface define contratos de implementação(isso é uma versão minizada do que eu responderia, porque só essa afirmação ficaria muito vaga).

Sugestão de leitura: páginas 28 a 36 do livro do Gof. Lá terá as respostas!

Uma coisa é certa: se você tentar[tentou] explicar o conceito desses dois, vai parecer que você está dando voltas e que não sabia a resposta. Ele perguntou a diferença arquitetural, não conceitual.

Mas fale ai da vaga, isso pode ajudar as pessoas a se prepararem se forem chamadas para participar de uma entrevista a vagas semelhantes!

uma resposta bem simples pode ser que um interface eh sempre 100% abstrata, onde há apenas metodos abstratos, uma class abstrata nem sempre eh 100% abstrata. Com interface vc tem um contrato entre class & interface.
menphis concordo, essa frase eh show.

A diferença arquitetural a meu ver, é que as interfaces são mais flexíveis e menos intrusivas, sendo uma melhor opção do que classes abstratas na estipulação de contratos entre objetos.

Por outro lado, com classes abstratas você tende a precisar de menos códigos.

Na prática, deve-se sempre favorecer o uso de composição em lugar de herança, o que implica em preferir interfaces ao invés de classes abstratas. Isso pode ser conseguido mantendo-do se o foco da arquitetura no príncipio de responsabilidade única e com o uso de alguns Design Patterns como o Strategy e o State. Se você conseguir isso, verá que não necessitará de herança de classes, o que significa também que não necessitará de classes abstratas. A única coisa chata que fica é que em vários lugares pode ser preciso vários métodos que apenas delegam as chamadas para objetos encapsulados, mas isso é considerado um problema da linguagem java e não da arquitetura, e mesmo assim, é possível trabalhar-se esse problema.

De fato, na década de 1980 a herança era vista como algo muito bom e bastante estimulada. Na década de 1990, quando java foi concebido, já se via que a herança múltipla criava mais problemas do que soluções, por isso java ficou com o esquema de herança única. Hoje em dia, acredita-se que qualquer herança seja algo ruim, e que o melhor é eliminá-la. O motivo é simples: A subclasse está fortemente acoplada ao comportamento da superclasse, e qualquer arquiteto sabe que acoplamento forte é algo muito ruim. No entanto interfaces não têm implementações, e portanto não sofrem deste problema.

Isso é a diferença arquitetural e acredito ser esse o tipo de resposta que o entrevistador esperava. A diferença na linguagem todo mundo sabe, mas a diferença arquitetural é algo mais profundo e requer muito mais experiência para ser compreendido.

A respota certa é que não ha diferença arquitetural nenhuma.

Existe sim diferença entre classes abstratas e interfaces em Java, mas nada que influencie a arquitetura final, pelo menos não deveria.

[quote=mochuara]A respota certa é que não ha diferença arquitetural nenhuma.

Existe sim diferença entre classes abstratas e interfaces em Java, mas nada que influencie a arquitetura final, pelo menos não deveria.[/quote]

Você é o entrevistador? Só ele pode afirmar isso!

Há muitas imprecisões aqui: A pergunta pode não ter sido daquela forma, se foi, o erro está na pergunta. Numa entrevista de emprego, com o rapaz nervoso[e querendo mostrar que sabe], o entrevistador pergunta algo cuja resposta pode ser pessoal, até filosófica, pode ter diversos pontos de vista. A pergunta mesmo pode ser interpretada de diversas formas.

Tinha uma amigo que falava que as pessoas acham que entrevistas de emprego são jogos, com diversas dessas “peraltices”. Mas não, são pra conhecer o entrevistado.

Então, antes de achar isso, considere as imprecisões, tanto do autor do post, quanto do entrevistador!

Uma resposta bem simples seria que substantivos indicam classes abstratas e adjetivos e substantivos abstratos indicam interfaces.