Difference between new and override

后端 未结 14 1495
再見小時候
再見小時候 2020-11-22 05:36

Wondering what the difference is between the following:

Case 1: Base Class

public void DoIt();

Case 1: Inherited class

<         


        
相关标签:
14条回答
  • 2020-11-22 05:46

    In the first case you are hiding the definition in the parent class. This means that it will only be invoked when you are dealing with the object as the child class. If you cast the class to its parent type, the parent's method will be invoked. In the second instance, the method is overridden and will be invoked regardless of whether the object is cast as the child or parent class.

    0 讨论(0)
  • 2020-11-22 05:46

    The difference between the two cases is that in case 1, the base DoIt method does not get overridden, just hidden. What this means is that depending on the type of the variable depends on which method will get called. For example:

    BaseClass instance1 = new SubClass();
    instance1.DoIt(); // Calls base class DoIt method
    
    SubClass instance2 = new SubClass();
    instance2.DoIt(); // Calls sub class DoIt method
    

    This can be really confusing and results in non expected behaviour and should be avoided if possible. So the preferred way would be case 2.

    0 讨论(0)
  • 2020-11-22 05:47

    The override modifier may be used on virtual methods and must be used on abstract methods. This indicates for the compiler to use the last defined implementation of a method. Even if the method is called on a reference to the base class it will use the implementation overriding it.

    public class Base
    {
        public virtual void DoIt()
        {
        }
    }
    
    public class Derived : Base
    {
        public override void DoIt()
        {
        }
    }
    
    Base b = new Derived();
    b.DoIt();                      // Calls Derived.DoIt
    

    will call Derived.DoIt if that overrides Base.DoIt.

    The new modifier instructs the compiler to use your child class implementation instead of the parent class implementation. Any code that is not referencing your class but the parent class will use the parent class implementation.

    public class Base
    {
        public virtual void DoIt()
        {
        }
    }
    
    public class Derived : Base
    {
        public new void DoIt()
        {
        }
    }
    
    Base b = new Derived();
    Derived d = new Derived();
    
    b.DoIt();                      // Calls Base.DoIt
    d.DoIt();                      // Calls Derived.DoIt
    

    Will first call Base.DoIt, then Derived.DoIt. They're effectively two entirely separate methods which happen to have the same name, rather than the derived method overriding the base method.

    Source: Microsoft blog

    0 讨论(0)
  • 2020-11-22 05:51
    • new means respect your REFERENCE type(left-hand side of =) , thereby running reference types's method. If redefined method doesn't have new keyword, it is behaved as it has. Moreover, it also known as non-polymorphic inheritance. That is, “I’m making a brand new method in the derived class that has absolutely nothing to do with any methods by the same name in the base class.” - by said Whitaker
    • override, which must be used with virtual keyword in its base class, means respect your OBJECT type(right-hand side of =), thereby running method overriden in regardless of reference type. Moreover, it also known as polymorphic inheritance.

    My way to bear in mind both keywords that they are opposite of each other.

    override: virtual keyword must be defined to override the method. The method using override keyword that regardless of reference type(reference of base class or derived class) if it is instantiated with base class, the method of base class runs. Otherwise, the method of derived class runs.

    new: if the keyword is used by a method, unlike override keyword, the reference type is important. If it is instantiated with derived class and the reference type is base class, the method of base class runs. If it is instantiated with derived class and the reference type is derived class, the method of derived class runs. Namely, it is contrast of override keyword. En passant, if you forget or omit to add new keyword to the method, the compiler behaves by default as new keyword is used.

    class A 
    {
        public string Foo() 
        {
            return "A";
        }
    
        public virtual string Test()
        {
            return "base test";
        }
    }
    
    class B: A
    {
        public new string Foo() 
        {
            return "B";
        }
    }
    
    class C: B 
    {
        public string Foo() 
        {
            return "C";
        }
    
        public override string Test() {
            return "derived test";
        }
    }
    

    Call in main:

    A AClass = new B();
    Console.WriteLine(AClass.Foo());
    B BClass = new B();
    Console.WriteLine(BClass.Foo());
    B BClassWithC = new C();
    Console.WriteLine(BClassWithC.Foo());
    
    Console.WriteLine(AClass.Test());
    Console.WriteLine(BClassWithC.Test());
    

    Output:

    A
    B
    B
    base test
    derived test
    

    New code example,

    Play with code by commenting in one-by-one.

    class X
    {
        protected internal /*virtual*/ void Method()
        {
            WriteLine("X");
        }
    }
    class Y : X
    {
        protected internal /*override*/ void Method()
        {
            base.Method();
            WriteLine("Y");
        }
    }
    class Z : Y
    {
        protected internal /*override*/ void Method()
        {
            base.Method();
            WriteLine("Z");
        }
    }
    
    class Programxyz
    {
        private static void Main(string[] args)
        {
            X v = new Z();
            //Y v = new Z();
            //Z v = new Z();
            v.Method();
    }
    
    0 讨论(0)
  • 2020-11-22 05:52

    The article below is in vb.net but I think the explanation about new vs overrides is very easy to grasp.

    https://www.codeproject.com/articles/17477/the-dark-shadow-of-overrides

    At some point in the article, there is this sentence:

    In general, Shadows assumes the function associated with the type is invoked, while Overrides assumes the object implementation is executed.

    The accepted answer to this question is perfect but I think this article provide good examples to add better meaning about the differences between these two keywords.

    0 讨论(0)
  • 2020-11-22 05:53

    virtual: indicates that a method may be overriden by an inheritor

    override: overrides the functionality of a virtual method in a base class, providing different functionality.

    new: hides the original method (which doesn't have to be virtual), providing different functionality. This should only be used where it is absolutely necessary.

    When you hide a method, you can still access the original method by up casting to the base class. This is useful in some scenarios, but dangerous.

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