Diferença entre override e new no C#

Vamos falar sobre os modificadores override e new. Quando utilizamos o override é possivel utilizarmos a tecnica de polimorfismo, como não declarar um objeto do tipo concreto apenas utilizar a abstração. Porém no caso do modificador new ele é apenas utilizado quando a variavel é especifica do tipo concreto. Para exemplificar será criado duas classes uma abstrata e uma concreta como a seguir:

 public abstract class MyBaseObject
    {
        public  abstract void MethodForOverride2();

        public virtual void MethodForOverride()
        {
            Console.WriteLine("MethodForOverride of MyBaseObject");
        }

        public void MethodForNew()
        {
            Console.WriteLine("MethodForNew of MyBaseObject");
        }


    }

    public class MyFirstConcreteObject : MyBaseObject
    {
        public override void MethodForOverride2()
        {
            Console.WriteLine("MethodForOverride2 of MyFirstConcreteObject");
        }

        public override void MethodForOverride()
        {
            Console.WriteLine("MethodForOverride of MyFirstConcreteObject");
        }
        public new void MethodForNew()
        {
            Console.WriteLine("MethodForNew of MyFirstConcreteObject");
        }
    }

Após isso faça a chamada assim em uma console application para executar os metodos:

            MyBaseObject myBaseObject = new MyFirstConcreteObject();
            MyFirstConcreteObject myConcreteObject = new MyFirstConcreteObject();

            Console.WriteLine("myBaseObject");
            myBaseObject.MethodForNew();
            myBaseObject.MethodForOverride();
            myBaseObject.MethodForOverride2();

            Console.WriteLine("");
            Console.WriteLine("myConcreteObject");
            myConcreteObject.MethodForNew();
            myConcreteObject.MethodForOverride();
            myConcreteObject.MethodForOverride2();

Executar esse codigo deve ter um retorno como na imagem. É possivel perceber que o metodo utilizando override sempre é utilizado da classe concreta, porém quando utilizado o modificador new depende do tipo de variavel que está sendo declarada.

Execucao

Todo o código deste post está no github neste link.

Anúncios

Definir Parametro generico por tipo(type)

Falando sobre reflection um necessidade que encontrei e vou colocar aqui é definir um parametro generico de uma classe por um Type, para isso podemos usar o metodo MakeGenericType. O conteudo é bem simples então vou apenas postar o codigo de como fazer sem muita necessidade de explicação.

            Type typeGenericList = typeof(MyClass);
            var ListWithoutType = typeof(IList<>); // this is a list generic without the generic type set
            var ListWithType = ListWithoutType.MakeGenericType(tipoEntidade); // this is a list generic with the generic parametier of MyClass IList<MyClass>