【c#】重寫和過載

ZeroWM發表於2014-05-05

初次看到這兩個名詞,感覺它們兩個有著千絲萬縷的聯絡似的,不過仔細一研究,發現它們的差異還是很大的。

通俗點說,重寫就是改頭換面,重新做人;過載就是給它加了個兄弟。

  

下面對比介紹一下重寫過載


重寫的規則:

1.在不同類中(有繼承關係的類之間,一般用於派生類)。

2. 重寫與被重寫方法的相同點:引數列表、返回值、丟擲異常,方法名   。  

3.重寫與被重寫方法的不同點:重寫方法的訪問修飾符>被重寫的訪問修飾符(public>package>protected>private);   方法體不同。

4.重寫的基方法必須是virtual、abstract或override,不能重寫非虛方法或靜態方法。


override和new區別:

new宣告的方法,子類呼叫,執行子類的函式,而如果型別是基類,被隱藏的基類函式就會被呼叫。

子類函式使用override,用子類的型別來呼叫,會執行子類的函式,類是基類的時候,仍會呼叫子類的函式。


舉例:

(源自C#過載和重寫的區別


public abstract class BaseClass//定義一個抽象的虛類
    {
        public abstract void ShowInfo();//定義虛方法
        public virtual void OutInfo()//定義抽象方法
        {
            Console.WriteLine("這是基類的虛方法!");
        }
    }

    public class SonClass : BaseClass//實現抽象基類BaseClass
    {
        public override void ShowInfo()//重寫基類的抽象方法
        {
            Console.WriteLine("重寫基類的抽象方法");
        }
        public override void OutInfo()//重寫基類的虛方法
        {
            Console.WriteLine("重寫基類的虛方法");
        }
    }


過載的規則:

1.在同一個類中  

2.方法名必須相同  

3.引數列表不能相同,返回值可以相同可以不同      

4.任何一個父類的函式在其一個子類中只能被重寫一次。



舉例:

   class BillPayment
    {
        void PayBill(int telephoneNumber)
        {
            //此方法用於支付固定電話費
        }
        void PayBill(long consumerNumber)
        {
            //此方法用於支付電費
        }

        void PayBill(long consumerNumber, double amount)
        {
            //此方法用於支付行動電話話費
        }
    }


感受:

貌似相同,就要找不同點,為了留下深刻的印象;貌似不同,就要找相同點,減少知識量。生活就是學習,學習來源於生活。對學習的知識有一個感性的認識,感性的認識很容易讓人接受,銘記,然後通過實踐去理解理論,進行總結,最後創新是我們的終極目標。



PS:2015年8月17日

為什麼用重寫:

  子類可以對父類的方法進行重寫,讓自己擁有父類的屬性,方法更加的靈活,實現了多型。

為什麼用過載:

  方法過載可以再不改變原來方法的基礎上,新增功能。提供了函式可擴充套件的能力。


重寫和過載對比:

  作用域:重寫(父類與子類),過載(方法之間)

  特點:重寫(方法名相同) ,過載(方法名相同,引數不同)

  



 


相關文章