Usuário com melhor resposta
Como usar a técnica de referenciar objeto por meio de interface?

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?
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
-
-
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
-
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
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
-
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
static void Main(string[] args)
{
public void quatroPatas()
{
}
}
{
Mamifero mamifero = new Cavalo();
mamifero.Anda();
} -
-
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
-
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, 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
-
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.