在面向對象中,繼承是三大特性必不可少的。繼承貌似沒有什么好說的,大家都懂,不就是兒子可以擁有父親的屬性和方法嗎~~~
是的~繼承就是讓兒子擁有父親的屬性和方法。在C#中,只能單繼承類和多繼續接口。這點我也不想再廢話。有興趣可以找下 接口注入
很多面試的時候,一般我們會遇到這樣兩個問題:
1.抽象類和接口,你是怎么選擇?
這個仁者見仁智者見智。我也不好說,我必須喜歡優先選擇接口。
2.override和overload的區別?
我這篇重點闡述這點,在開始前,先列舉出關鍵字: virtual、abstract,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; } }