C# 基礎系列--繼承一(override和overload)


  在面向對象中,繼承是三大特性必不可少的。繼承貌似沒有什么好說的,大家都懂,不就是兒子可以擁有父親的屬性和方法嗎~~~

是的~繼承就是讓兒子擁有父親的屬性和方法。在C#中,只能單繼承類和多繼續接口。這點我也不想再廢話。有興趣可以找下 接口注入

很多面試的時候,一般我們會遇到這樣兩個問題:

1.抽象類和接口,你是怎么選擇?

  這個仁者見仁智者見智。我也不好說,我必須喜歡優先選擇接口。

2.override和overload的區別?

   我這篇重點闡述這點,在開始前,先列舉出關鍵字: virtualabstract,override(overload沒有關鍵字) 

     abstract修飾類為 抽象類,不能被事例化。 修飾方法的時候,為抽象方法(類必須是抽象類),必須被override。

     virtual只能修飾方法,聲明為 虛方法,你想實現就實現,不實現也可以。

   override 在msdn的解釋    

override 方法提供從基類繼承的成員的新實現。 由 override 聲明重寫的方法稱為重寫基方法。 重寫的基方法必須與 override 方法具有相同的簽名。 有關繼承的信息,請參見繼承(C# 編程指南)。

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

override 聲明不能更改 virtual 方法的可訪問性。 override 方法和 virtual 方法必須具有相同的訪問級別修飾符。

您不能使用 new、static 或 virtual 修飾符來修改 override 方法。

    從msdn中,我們很明顯的得到幾個結論:

      1.父類中有abstract,那么子類同名方法必定有override。

      2.若父類中有 virtual方法,子類同名方法不一定是override,可能是overload。

      3.override必定有父子類關系。可以用青出於藍而勝於藍吧。兒子超越了父親。

 

overload 在msdn沒有這個關鍵字,不過他應該說是類的三大特性中的多態。(如果非要說有關鍵字,我想應該是new ,很多時候,我們都可以省卻。這個說法很不嚴謹的哦) 在面向對象中一定提到運算符operator,這個就是overload的一個例子。只不過這個比較特殊,他必須是static方法。而且就不能還不能是我上面說的new 。所以說這個說法很不嚴謹。

 

重載overload 是一個類中多態性的一種表現。

子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。

這幾話刪除的時候沒注意,沒有把他刪掉,謝謝3# madfrag的提醒

如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(overload )。 overload 的方法是可以改變返回值的類型。

  

  這個說法是我在java中看到不過也 完全適用於 C#。

  現在加刪除線的內容,是有問題的。為此我開了新的一篇---繼承二

 

  隨便擴展下吧。正是這個運算符重載,才讓很多朋友認為string是值類型,不是引用類型。其實他是引用類型。他只不過是重載了運算符而已,讓他看起來是值類型。

   

附上一個小例子包含了我上面說的內容了~

    public abstract class Ba
    {
        public virtual void Test() { }

        public virtual int Property { get; set; }

        public abstract string Nature { get; set; }

        
    }

    public class Sun : Ba
    {
        protected void Test()
        {

        }

        public override int Property
        {
            get
            {
                return base.Property;
            }
            set
            {
                base.Property = value;
            }
        }

        public override string Nature
        {
            get
            {
                throw new NotImplementedException();
            }
            set
            {
                throw new NotImplementedException();
            }
        }

        public static Sun operator +(Sun b1, Sun b2)
        {
            return null;
        }
    }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM