Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        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();
        }
Exemplo n.º 3
0
        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
        }
Exemplo n.º 4
0
        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();
        }