Usuário com melhor resposta
Guardar referencia de um objeto em uma variavel do tipo de outra classe

Pergunta
-
Respostas
-
É um assunto um tanto quanto delicado e importantíssimo quee requer um pouco de aprofundamento, mas vou tentar explicar de forma simples.
Quando você usa uma interface, você está orientando o seu sistema para que foque na abstração(interface) e nunca na implementação(classe).
O que eu quero dizer com isso:
Imagine um cenário onde você precisa escrever uma classe que grave logs, que podem ser de 3 formas: banco de dados, xml, arquivo texto.
Você terá uma interface chamada ILog, com três classes que a implementam:LogBancoDeDados -> Implementa a interface ILog
LogXml -> Implementa a interface ILog
LogArquivoTexto -> Implementa a interface ILog
A interface ILog tem a descrição(somente a descrição, não o código) do método GravaLog().
Por esse motivo, todas as 3 classes devem, por definição, implementar seus próprio código de gravar log dentro do método GravaLog().
Digamos que seu sistema vai gravar o log no banco de dados, você instancia o objeto ILog da seguinte forma: ILog log = new LogBancoDeDados();Quando você chamar o método log.GravaLog(), ele vai executar o código de gravação da classe LogBancoDeDados.
Qual é a vantagem disso?
Se amanhã sua aplicação mudar a forma de gravar log, passa a ser no arquivo texto, você só precisa trocar a forma de instanciar:
ILog log = new LogArquivoTexto();
Finalmente, todo os lugares onde você chama log.GravaLog() não precisarão ser modificados, pois ele já vai executar o código da classe LogArquivoTexto.
Esse é um recurso muito poderoso, pois se aparecer outros métodos de gravação de log, você só precisa escrever a nova classe implementando a interface (obrigando a escrever todos os métodos, no caso GravaLog()) e mudar a forma de instanciar. Mas esse é só um dos benefícios.
Agora, por quê você não consegue acessar os métodos de ContaCorrente?
R: Porque quando você instancia um objeto a partir de uma interface (ILog log = new LogBancoDeDados), o objeto log só terá acesso aos métodos que a sua classe implementa a partir da interface, ou seja, GravaLog().
Em resumo, uma interface é um contrato onde cada método é uma cláusula. Quando uma classe implementa esta interface, ela é obrigada a implementar todos os métodos da interface (tem que cumprir com todas as cláusulas do contrato)
Espero ter ajudado em algo. Não deixe de estudar sobre orientação a objetos, principalmente abstração e encapsulamento. Mas em OOP todos as características tem extrema importância para a construção de um bom software.
- Marcado como Resposta arthurocalzolari terça-feira, 21 de janeiro de 2014 23:45
Todas as Respostas
-
Você está criando um objeto na memoria chamado c do tipo ContaCorrente !!!!!!!!!! basicamente isso
Diego Almeida Barreto
System Analyst / Software Developer
-
Suponho que IConta seja uma interface:
-Se a classe ContaCorrente implementa essa interface, então você está criando um objeto c do tipo ContaCorrente.
-Se a classe ContaCorrente não implementa essa interface, então haverá um erro na compilação.
Se IConta não é uma interface:
-Se IConta é uma classe, a instância só é válida se ContaCorrente é uma herança de IConta.
-Se ContaCorrente não é uma herança de IConta, então haverá um erro de compilação.
-
Interfaces são references type, então quando você cria um objeto utilizando a INTERFACE você esta fazendo referência ao endereço de memoria alocada quando o comando new ContaCorrente() é executado.
Espero ter ajudado!
Somente Analista de Sistema e Traficante tem usuário
-
-
-
É um assunto um tanto quanto delicado e importantíssimo quee requer um pouco de aprofundamento, mas vou tentar explicar de forma simples.
Quando você usa uma interface, você está orientando o seu sistema para que foque na abstração(interface) e nunca na implementação(classe).
O que eu quero dizer com isso:
Imagine um cenário onde você precisa escrever uma classe que grave logs, que podem ser de 3 formas: banco de dados, xml, arquivo texto.
Você terá uma interface chamada ILog, com três classes que a implementam:LogBancoDeDados -> Implementa a interface ILog
LogXml -> Implementa a interface ILog
LogArquivoTexto -> Implementa a interface ILog
A interface ILog tem a descrição(somente a descrição, não o código) do método GravaLog().
Por esse motivo, todas as 3 classes devem, por definição, implementar seus próprio código de gravar log dentro do método GravaLog().
Digamos que seu sistema vai gravar o log no banco de dados, você instancia o objeto ILog da seguinte forma: ILog log = new LogBancoDeDados();Quando você chamar o método log.GravaLog(), ele vai executar o código de gravação da classe LogBancoDeDados.
Qual é a vantagem disso?
Se amanhã sua aplicação mudar a forma de gravar log, passa a ser no arquivo texto, você só precisa trocar a forma de instanciar:
ILog log = new LogArquivoTexto();
Finalmente, todo os lugares onde você chama log.GravaLog() não precisarão ser modificados, pois ele já vai executar o código da classe LogArquivoTexto.
Esse é um recurso muito poderoso, pois se aparecer outros métodos de gravação de log, você só precisa escrever a nova classe implementando a interface (obrigando a escrever todos os métodos, no caso GravaLog()) e mudar a forma de instanciar. Mas esse é só um dos benefícios.
Agora, por quê você não consegue acessar os métodos de ContaCorrente?
R: Porque quando você instancia um objeto a partir de uma interface (ILog log = new LogBancoDeDados), o objeto log só terá acesso aos métodos que a sua classe implementa a partir da interface, ou seja, GravaLog().
Em resumo, uma interface é um contrato onde cada método é uma cláusula. Quando uma classe implementa esta interface, ela é obrigada a implementar todos os métodos da interface (tem que cumprir com todas as cláusulas do contrato)
Espero ter ajudado em algo. Não deixe de estudar sobre orientação a objetos, principalmente abstração e encapsulamento. Mas em OOP todos as características tem extrema importância para a construção de um bom software.
- Marcado como Resposta arthurocalzolari terça-feira, 21 de janeiro de 2014 23:45