57.C#類繼承中方法的隱藏與覆蓋

在子類中,可以隱藏和覆蓋基類的方法。隱藏和覆蓋有所不同。隱藏是把基類方法遮蔽,覆蓋是在子類中把基類方法替換掉。隱藏用new的方法,覆蓋用override的方法。兩者的區別是:用new方法只是隱藏了基類方法,基類方法還存在,通過一定方式還可以調用。用override是替換掉了基類方法。下面以例子來說明。python中的重寫就很簡單了,就是在子類中重寫該方法就可以了。

public class Creature
{
    public Creature()
    {
        Console.WriteLine("這是Creature類");
    }
    public Creature(string str)
    {
        Console.WriteLine($"先執行帶參數的Creature類,參數是{str}");
    }

    public void DoSomething() => Console.WriteLine("這是Creature類的DoSomething方法");
    public virtual void VirtualDosomething() => Console.WriteLine("這是Creature類的VirtualDosomething方法");
    public virtual void VirtualDosomething2() => Console.WriteLine("這是Creature類的VirtualDosomething2方法");
    public virtual void VirtualDosomething3() => Console.WriteLine("這是Creature類的VirtualDosomething3方法");
}

public class Animal : Creature
{
    public Animal() : this("馬")//注意:這裏是實際參數,不是對參數的定義。
    {
        Console.WriteLine("最後執行不帶參數的Animal類");
    }

    public Animal(string str) : base(str)
    {
        Console.WriteLine($"再執行帶參數的Animal類。參數是{str}");
    }

    new public void DoSomething() => Console.WriteLine("這是Animal類的DoSomething方法");//用new的方法隱藏基類方法
    public override void VirtualDosomething()//用override覆蓋基類方法
    {
        Console.WriteLine("基類方法VirtualDosomething已經被覆蓋。");

    }

    new public void VirtualDosomething2() => Console.WriteLine("這是Creature類的VirtualDosomething2方法");//利用new 來覆蓋基類virtual方法

    public override void VirtualDosomething3()//用override覆蓋基類方法
    {
        Console.WriteLine("重新調用基類方法VirtualDosomething。");
        base.VirtualDosomething3();

    }
}
class Program
{
    static void Main(string[] args)
    {
        Animal ani = new Animal();
        ani.DoSomething();//隱藏基類此方法
        ani.VirtualDosomething();//覆蓋基類方法
        ani.VirtualDosomething2();//隱藏基類virtual方法
        ani.VirtualDosomething3();//重新調用基類方法。
        Creature cr = ani;//父類引用子類
        cr.DoSomething();//調用基類方法
        cr.VirtualDosomething();//override後,調用的是Animail的VirtualDosomething()方法。基類方法被覆蓋。
        cr.VirtualDosomething2();//new後,調用的依然是Creatrue的VirtualDosomething2()方法。基類方法沒有被覆蓋。
    }
}

輸出是:

python中的子類對繼承類的重寫

class A:
    def __init__(self):
        print("This is CLASS A")

    def methodOne(self):
        print("Class A method.")


class B(A):
    def __init__(self):
        print("This is CLASS B")

    def methodOne(self):
        print("Class B method.")


b=B()
b.methodOne()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章