none
Guardar referencia de um objeto em uma variavel do tipo de outra classe RRS feed

  • Pergunta

  • Duvida boba, mas fiquei confuso, o que acontece quando se faz isso? 

    ex:

    IConta c = new ContaCorrente();

    obrigado

    Arthuro

    sexta-feira, 17 de janeiro de 2014 12:52

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
    sábado, 18 de janeiro de 2014 01:28

Todas as Respostas

  • arthurocalzolari,

    Você está criando um objeto na memoria chamado c do tipo ContaCorrente !!!!!!!!!! basicamente isso



    Diego Almeida Barreto
    System Analyst / Software Developer

    sexta-feira, 17 de janeiro de 2014 13:00
  • 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.

    sexta-feira, 17 de janeiro de 2014 13:11
  • 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

    sexta-feira, 17 de janeiro de 2014 13:11
  • Classes definidas pelo usuário também são Reference Types
    sexta-feira, 17 de janeiro de 2014 13:21
  • Mas para que serve isso e qual situacao eu usaria? E eu nao consigo acessar as propriedades e metodos de ContaCorrente..

    Vlw

    sexta-feira, 17 de janeiro de 2014 23:29
  • É 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
    sábado, 18 de janeiro de 2014 01:28