C# - Keyword usage virtual+override vs. new

后端 未结 10 2079
被撕碎了的回忆
被撕碎了的回忆 2020-11-22 06:06

What are differences between declaring a method in a base type \"virtual\" and then overriding it in a child type using the \"override\" keyword as

相关标签:
10条回答
  • 2020-11-22 06:51

    The "new" keyword doesn't override, it signifies a new method that has nothing to do with the base class method.

    public class Foo
    {
         public bool DoSomething() { return false; }
    }
    
    public class Bar : Foo
    {
         public new bool DoSomething() { return true; }
    }
    
    public class Test
    {
        public static void Main ()
        {
            Foo test = new Bar ();
            Console.WriteLine (test.DoSomething ());
        }
    }
    

    This prints false, if you used override it would have printed true.

    (Base code taken from Joseph Daigle)

    So, if you are doing real polymorphism you SHOULD ALWAYS OVERRIDE. The only place where you need to use "new" is when the method is not related in any way to the base class version.

    0 讨论(0)
  • 2020-11-22 06:51
    • new keyword is for Hiding. - means you are hiding your method at runtime. Output will be based base class method.
    • override for overriding. - means you are invoking your derived class method with the reference of base class. Output will be based on derived class method.
    0 讨论(0)
  • 2020-11-22 06:53

    Here's some code to understand the difference in the behavior of virtual and non-virtual methods:

    class A
    {
        public void foo()
        {
            Console.WriteLine("A::foo()");
        }
        public virtual void bar()
        {
            Console.WriteLine("A::bar()");
        }
    }
    
    class B : A
    {
        public new void foo()
        {
            Console.WriteLine("B::foo()");
        }
        public override void bar()
        {
            Console.WriteLine("B::bar()");
        }
    }
    
    class Program
    {
        static int Main(string[] args)
        {
            B b = new B();
            A a = b;
            a.foo(); // Prints A::foo
            b.foo(); // Prints B::foo
            a.bar(); // Prints B::bar
            b.bar(); // Prints B::bar
            return 0;
        }
    }
    
    0 讨论(0)
  • 2020-11-22 06:55

    virtual / override tells the compiler that the two methods are related and that in some circumstances when you would think you are calling the first (virtual) method it's actually correct to call the second (overridden) method instead. This is the foundation of polymorphism.

    (new SubClass() as BaseClass).VirtualFoo()
    

    Will call the SubClass's overriden VirtualFoo() method.

    new tells the compiler that you are adding a method to a derived class with the same name as a method in the base class, but they have no relationship to each other.

    (new SubClass() as BaseClass).NewBar()
    

    Will call the BaseClass's NewBar() method, whereas:

    (new SubClass()).NewBar()
    

    Will call the SubClass's NewBar() method.

    0 讨论(0)
提交回复
热议问题