none
Como usar a técnica de referenciar objeto por meio de interface? RRS feed

  • Pergunta

  • Pessoal,

    Como faço para usar essa técnica de referenciar um objeto como tipo Interface em um método?

    int FindLandSpeed(ILandBound landBoundMammal)

    {

    }

    Neste exemplo eu tenho um objeto landBoundMammal do tipo ILandBound, como posso passar um parâmetro para este método?

    quarta-feira, 5 de agosto de 2015 18:40

Respostas

  • Olá,

    Não sei se compreendi bem... mas se você criar uma instância de um objeto que herde da mesma interface, poderá passar como parâmetro para este método. Por exemplo:

    Tenho a interface1

    public interface interface1
    {
       ...propriedades
    }

    A partir da interface1 crio a classe1

    public class classe1 : interface1
    {
       ...implementação
    }

    Tenho a classe2 que tem um método que recebe o tipo interface1

    public class classe2
    {
        public void metodo1(interface1 parâmetro)
        {
            ..implementação
        }
    }

    Posso passar uma instância da minha classe1, pois ela herda da interface1 então o parâmetro é aceito.

    var objClasse1 = new classe1();
    var objClasse2 = new classe2();
    
    objClasse2.metodo1(objClasse1);

    Espero ter ajudado.


    Fabio Rosa.

    • Marcado como Resposta LWMN sábado, 8 de agosto de 2015 23:05
    quinta-feira, 6 de agosto de 2015 01:07
  • Boa tarde.

    Pelo que entendi, talvez você esteja querendo usar injeção de dependência, conhecido também como IOC, caso seja isso, procure por Ninject e como usar.


    • Marcado como Resposta LWMN sábado, 8 de agosto de 2015 23:05
    quinta-feira, 6 de agosto de 2015 17:33
  • Olá,

    Talvez você esteja falando de IoC como o Cesar Mendes comentou. Seria interessante você pesquisar um pouco sobre isto também.

    Mas respondendo sua pergunta, esta estruturação é chamada de baixo acoplamento. Imagine que em seu sistema existe um método que deva fazer algo com um objeto do tipo "Animal" como seu exemplo, e que esta ação seja comum para todos os animais, se você não usar uma interface "IAnimal" por exemplo, e adicionar esta ação na interface, este seu método receberia qual tipo? Talvez um object, mas então você estaria sendo obrigado a fazer boxing e unboxing... Recebendo a interface "IAnimal" e herdando cad animal dela, você permite que os comportamentos comuns sejam definidos na interface, mas a implementação na classe que a herdou, e permite que, no exemplo que estou dando, você somente tenha um método que receba o tipo "IAnimal" mas que pode ser executado por qualquer classe que herde esta interface.

    Não sei se consegui esclarecer bem...

    Abraço!


    Fabio Rosa.

    • Marcado como Resposta LWMN sábado, 8 de agosto de 2015 23:05
    sexta-feira, 7 de agosto de 2015 00:35
  • Sim, o framework Ninject é uma das bibliotecas que facilita a implementações de técnicas como esta. Além disso, alguns frameworks também trazem o ganho de unidade de trabalho, onde uma classe é instanciada apenas uma vez no sistema, poupando recursos de memória e processamento. Acredito que o Ninject também tenha esta funcionalidade. Eu utilizo mais o Unity, mas pelo que vi são parecidos. Vale a pena você estudar um pouco sobre esta questão de IoC, baixo acoplamento, Unidade de trabalho, que futuramente na manutenção de seu sistema você vai sentir a diferença.

    Att,


    Fabio Rosa.

    • Marcado como Resposta LWMN sábado, 8 de agosto de 2015 23:05
    sexta-feira, 7 de agosto de 2015 16:36

Todas as Respostas

  • Olá,

    Não sei se compreendi bem... mas se você criar uma instância de um objeto que herde da mesma interface, poderá passar como parâmetro para este método. Por exemplo:

    Tenho a interface1

    public interface interface1
    {
       ...propriedades
    }

    A partir da interface1 crio a classe1

    public class classe1 : interface1
    {
       ...implementação
    }

    Tenho a classe2 que tem um método que recebe o tipo interface1

    public class classe2
    {
        public void metodo1(interface1 parâmetro)
        {
            ..implementação
        }
    }

    Posso passar uma instância da minha classe1, pois ela herda da interface1 então o parâmetro é aceito.

    var objClasse1 = new classe1();
    var objClasse2 = new classe2();
    
    objClasse2.metodo1(objClasse1);

    Espero ter ajudado.


    Fabio Rosa.

    • Marcado como Resposta LWMN sábado, 8 de agosto de 2015 23:05
    quinta-feira, 6 de agosto de 2015 01:07
  • Olá,

    Não sei se compreendi bem... mas se você criar uma instância de um objeto que herde da mesma interface, poderá passar como parâmetro para este método. Por exemplo:

    Tenho a interface1

    public interface interface1
    {
       ...propriedades
    }

    A partir da interface1 crio a classe1

    public class classe1 : interface1
    {
       ...implementação
    }

    Tenho a classe2 que tem um método que recebe o tipo interface1

    public class classe2
    {
        public void metodo1(interface1 parâmetro)
        {
            ..implementação
        }
    }

    Posso passar uma instância da minha classe1, pois ela herda da interface1 então o parâmetro é aceito.

    var objClasse1 = new classe1();
    var objClasse2 = new classe2();
    
    objClasse2.metodo1(objClasse1);

    Espero ter ajudado.


    Fabio Rosa.

    Boa tarde Fábio, vamos ver se eu entendi a sua explicação. Então, se eu quiser limitar as informações passadas para o parâmetro de um determinado método para que receba apenas o que tiver em uma instância eu usaria esta técnica?

    Então qual a finalidade de eu usar como tipo uma Classe base na criação de uma instância sendo que só vou receber o tipo da classe base e não vou ter acesso aos campos e métodos públicos da subclasse como o exemplo abaixo?

        class Mamifero
        {
            public void Anda()
            {

            }
        }

        class Cavalo : Mamifero
        {
            public void quatroPatas()
            {

            }
        }

        static void Main(string[] args)
        {
                Mamifero mamifero = new Cavalo();
                mamifero.Anda();
        }

    quinta-feira, 6 de agosto de 2015 17:12
  • Boa tarde.

    Pelo que entendi, talvez você esteja querendo usar injeção de dependência, conhecido também como IOC, caso seja isso, procure por Ninject e como usar.


    • Marcado como Resposta LWMN sábado, 8 de agosto de 2015 23:05
    quinta-feira, 6 de agosto de 2015 17:33
  • Olá,

    Talvez você esteja falando de IoC como o Cesar Mendes comentou. Seria interessante você pesquisar um pouco sobre isto também.

    Mas respondendo sua pergunta, esta estruturação é chamada de baixo acoplamento. Imagine que em seu sistema existe um método que deva fazer algo com um objeto do tipo "Animal" como seu exemplo, e que esta ação seja comum para todos os animais, se você não usar uma interface "IAnimal" por exemplo, e adicionar esta ação na interface, este seu método receberia qual tipo? Talvez um object, mas então você estaria sendo obrigado a fazer boxing e unboxing... Recebendo a interface "IAnimal" e herdando cad animal dela, você permite que os comportamentos comuns sejam definidos na interface, mas a implementação na classe que a herdou, e permite que, no exemplo que estou dando, você somente tenha um método que receba o tipo "IAnimal" mas que pode ser executado por qualquer classe que herde esta interface.

    Não sei se consegui esclarecer bem...

    Abraço!


    Fabio Rosa.

    • Marcado como Resposta LWMN sábado, 8 de agosto de 2015 23:05
    sexta-feira, 7 de agosto de 2015 00:35
  • Olá,

    Talvez você esteja falando de IoC como o Cesar Mendes comentou. Seria interessante você pesquisar um pouco sobre isto também.

    Mas respondendo sua pergunta, esta estruturação é chamada de baixo acoplamento. Imagine que em seu sistema existe um método que deva fazer algo com um objeto do tipo "Animal" como seu exemplo, e que esta ação seja comum para todos os animais, se você não usar uma interface "IAnimal" por exemplo, e adicionar esta ação na interface, este seu método receberia qual tipo? Talvez um object, mas então você estaria sendo obrigado a fazer boxing e unboxing... Recebendo a interface "IAnimal" e herdando cad animal dela, você permite que os comportamentos comuns sejam definidos na interface, mas a implementação na classe que a herdou, e permite que, no exemplo que estou dando, você somente tenha um método que receba o tipo "IAnimal" mas que pode ser executado por qualquer classe que herde esta interface.

    Não sei se consegui esclarecer bem...

    Abraço!


    Fabio Rosa.

    Sim Fábio, entendi o seu exemplo. Para aplicar melhor o entendimento da orientação a objeto esta técnica ou recurso chamado de Ninject teria esse objetivo?
    sexta-feira, 7 de agosto de 2015 15:16
  • Sim, o framework Ninject é uma das bibliotecas que facilita a implementações de técnicas como esta. Além disso, alguns frameworks também trazem o ganho de unidade de trabalho, onde uma classe é instanciada apenas uma vez no sistema, poupando recursos de memória e processamento. Acredito que o Ninject também tenha esta funcionalidade. Eu utilizo mais o Unity, mas pelo que vi são parecidos. Vale a pena você estudar um pouco sobre esta questão de IoC, baixo acoplamento, Unidade de trabalho, que futuramente na manutenção de seu sistema você vai sentir a diferença.

    Att,


    Fabio Rosa.

    • Marcado como Resposta LWMN sábado, 8 de agosto de 2015 23:05
    sexta-feira, 7 de agosto de 2015 16:36
  • Sim, o framework Ninject é uma das bibliotecas que facilita a implementações de técnicas como esta. Além disso, alguns frameworks também trazem o ganho de unidade de trabalho, onde uma classe é instanciada apenas uma vez no sistema, poupando recursos de memória e processamento. Acredito que o Ninject também tenha esta funcionalidade. Eu utilizo mais o Unity, mas pelo que vi são parecidos. Vale a pena você estudar um pouco sobre esta questão de IoC, baixo acoplamento, Unidade de trabalho, que futuramente na manutenção de seu sistema você vai sentir a diferença.

    Att,


    Fabio Rosa.

    Obrigado Fábio, vou estudar sobre os dois para entender melhor o funcionamento!
    domingo, 9 de agosto de 2015 03:58