static void Main(string[] args) { ManipuladorFTP <Nivel2> ftp = new ManipuladorFTP <Nivel2>(); IArmazenador <Nivel3> armazenador = ftp; armazenador.Armazenar(new Nivel3()); IRecuperador <Nivel1> recuperador = ftp; Console.WriteLine(recuperador.Recuperar(0)); Console.ReadKey(); }
static void Main(string[] args) { ManipuladorFTP <Nivel2> FTP = new ManipuladorFTP <Nivel2>(); IArmazenador <Nivel3> armazenador = FTP; armazenador.Armazenar(new Nivel3()); IRecuperador <Nivel1> recuperador = FTP; Console.WriteLine(recuperador.Recuperar(0)); FTP.Armazenar(new Nivel2()); Console.WriteLine(FTP.Recuperar(0)); //Retornará o ToString da classe com namespace + nome da classe Console.ReadKey(); }
static void Main(string[] args) { ManipuladorFTP <Nivel2> ftp = new ManipuladorFTP <Nivel2>(); //Contravariancia: um tipo mais genérico é convertido para um tipo mais específico //IArmazenador Nivel3(que é mais especifico das classes) consegue receber ftp que é Nivel2(mais generico que Nivel3) graças a keyword in na Interface IArmazenador IArmazenador <Nivel3> armazenador = ftp; armazenador.Armazenar(new Nivel3()); //Covariancia: um tipo mais específico é convertido para um tipo mais genérico //IRecuperador Nivel1(que é mais generico das classes) consegue receber ftp que é Nivel2(mais especifico que Nivel1) graças a keyword out na Interface IRecuperador IRecuperador <Nivel1> recuperador = ftp; Console.WriteLine(recuperador.Recuperar(0)); Console.ReadKey(); //Lembrando que ManipuladorFTP, IArmazenador e IRecuperador são reference-type, ou seja, estão apontando exatamente para a mesma posição de memíria, para o mesmo objeto na memória }
static void Main(string[] args) { ManipuladorFTP <Nivel2> ftp = new ManipuladorFTP <Nivel2>(); /* O trecho abaixo demonstra a contravariância ao atribuir à variável armazenador, à qual estava * atribuído um tipo Nivel3 (que é o mais específico neste exemplo), o Manipulador de FTP tipado * com Nivel2. Isto é, houve uma conversão implícita de um tipo genérico para um mais específico */ IArmazenavel <Nivel3> armazenador = ftp; /*Contudo, o tipo empregado no método Armazenar ainda deve ser Nivel3, pois a variável armazenador * foi definida com o tipo Nivel3 */ armazenador.Armazenar(new Nivel3()); /* Já o trecho abaixo exemplifica a covariância, ao converter de um tipo mais específico (Nivel2) * para outro mais genérico (Nivel1). */ IRecuperavel <Nivel1> recuperador = ftp; Console.WriteLine(recuperador.Recuperar(0)); Console.ReadKey(); }