C# virtual method new override 區別

class Parent
{
    public string Method()
    {            
        return virtualMethod() + "\nParent Method";
    }
    public virtual string virtualMethod()
    {
        return "Parent Virtual Method! ";
    }
}

class ChildNew : Parent
{
    public new string virtualMethod()
    {
        return "Son New Virtual Method! ";
    }
}

class ChildOverride : Parent
{
    public override string virtualMethod()
    {
        return "Son Override Virtual Method! ";
    }
}

class Program
{        
    static void Main(string[] args)
    {
        ChildNew cn = new ChildNew();
        // new 可以透過轉型呼叫原來的 virtual method
        Console.WriteLine(((Parent)cn).virtualMethod());
        Console.WriteLine(cn.virtualMethod());
        // Parent.Method 呼叫的 virtual Method 是 Parent 類的,因為 new 只是隱藏原來的 virtual method
        Console.WriteLine(cn.Method()); 

        Console.WriteLine();

        ChildOverride co = new ChildOverride();
        // override 無法透過轉型呼叫原來的 virtual method
        Console.WriteLine(((Parent)co).virtualMethod());
        Console.WriteLine(co.virtualMethod());
        // Parent.Method 呼叫的 virtual Method 是 Child 類的,因為 override 已經覆蓋原來的 virtual method
        Console.WriteLine(co.Method());

        Console.WriteLine();

        // 多型
        Parent po = new ChildOverride();
        // 呼叫的是 Child 類的 virtual method
        Console.WriteLine(po.virtualMethod());

        Console.WriteLine();

        Parent pn = new ChildNew();
        // 呼叫的是 Parent 類的 virtual method
        Console.WriteLine(pn.virtualMethod());

        Console.Read();
    }
}

結論

如果是override,就和一般的繼承一樣,但若是用到new,就是看變數型別來決定呼叫的是哪裡的方法,如果這個變數型別裡面的方法是繼承而來的,就會回到父層去執行,而如果父層裡面還有呼叫其他方法,只要子層沒有override,則都會執行父層的方法。

發佈留言