標籤:ar sp strong on 問題 log bs ad as
介面
1.介面只提供方法規約,不提供方法體;
2.介面中的方法不能用關鍵字修飾;
3.介面裡不能有介面和變數;
4.介面裡的方法在子類中必須全部實現;
5.介面可以實現多重繼承;
抽象類別
1.抽象類別可以從介面繼承;
2.抽象類別中的實體方法在子類中不可以重寫,只可以被引用;
3.抽象類別中的抽象方法不可以有方法體,抽象類別中的抽象方法在子類中必須重寫;
4.抽象類別中的虛方法在子類中可以選擇性的重寫;
虛方法
1.可以在子類選擇性的重寫;
2.不重寫也可被子類調用;
介面與抽象類別的異同
1.抽象類別的抽象方法和介面內的方法,在子類中必須全部被實現;
2.抽象方法和介面中的方法都不可以有方法體;
抽象方法與虛方法的異同
1.抽象方法所在的類必須是抽象類別,虛方法可以在任何類裡;
2.抽象方法必須被重寫,虛方法的重寫有選擇性;
3.抽象方法不可以被子類調用,虛方法可以被子類調用;
4.抽象方法不可以有方法體,虛方法必須有方法體
C#抽象類別和介面孩子間在對於抽象類別定義的支援方面具有很大的相似性,甚至可以相互替換,因此很多開發人員在進行抽象類別定義時對於抽象類別和介面的選擇顯得比較隨意。其實,兩者之間還是有很大區別的。
首先說一下介面與抽象類別的異同:
相同點:
1.他們都不能執行個體化自己,也就是說都是用來被繼承的。
2.抽象類別中的抽象方法和介面方法一樣,都不能有方法體
不同點:
1.抽象類別裡可以有欄位,介面中不能有欄位.
2.抽象類別中的普通方法可以有方法體,而介面方法沒有方法體。
3.介面中的方法不能有存取修飾詞,抽象類別中的抽象方法被繼承,需要override重寫 .
4.介面更像是一種規範,一種約束。
5.一個子類只能繼承一個抽象類別,但卻可以繼承多個介面。
接下來是抽象方法和虛方法的異同:
其實可以把抽象方法看做是沒有方法體的虛方法。
相同點:
1.抽象方法和虛方法都可以被重寫。
不同點:
1.abstract 和virtual的關鍵字不同
2.抽象方法一定沒有方法體,而虛方法可以有方法體。
下面寫個例子說明一下:
- /// <summary>
- /// 一個手機的抽象類別
- /// </summary>
- public abstract class Mobilephone
- {
- private string _logo;
- public string Logo
- {
- get { return _logo; }
- set { _logo = value; }
- }
- public abstract void Call();
- public virtual void Callagain()
- {
- Console.WriteLine("我再打一個電話");
- }
- }
- /// <summary>
- /// 定義一個實體類,繼承了一個抽象類別及多個介面
- /// </summary>
- public class Nokia :Mobilephone,IClock,Ilistenmusic
- {
- public override void Call()
- {
- Console.WriteLine("NOKIA打電話沒問題");
- }
- public void clock()
- {
- Console.WriteLine("NOKIA的手機也有鬧鐘功能");
- }
- public void listenmusic()
- {
- Console.WriteLine("NOKIA的手機還能聽歌");
- }
- public override void Callagain()
- {
- Console.WriteLine("算了,還是不打了");
- }
- }
- /// <summary>
- /// 下面定義了兩個介面,為了說明可以繼承多個介面
- /// </summary>
- public interface Ilistenmusic
- {
- void listenmusic();
- }
- public interface IClock
- {
- void clock();
- }
在補充一個小例子,
這裡有到很有意思的面試題,說名了new關鍵字和override的區別:
- class Program
- {
- static void Main(string[] args)
- {
- B5 b5 = new B5();
- b5.MethodB();
- }
- }
- public class A5
- {
- public virtual void MethodA()
- {
- Console.WriteLine("A5.MethodA");
- Console.Read();
- }
- public virtual void MethodB()
- {
- MethodA();
- }
- }
- public class B5 :A5
- {
- public new void MethodA()
- {
- Console.WriteLine("B5.MethodA");
- Console.ReadLine();
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- B5 b5 = new B5();
- b5.MethodB();
- }
- }
- public class A5
- {
- public virtual void MethodA()
- {
- Console.WriteLine("A5.MethodA");
- Console.Read();
- }
- public virtual void MethodB()
- {
- MethodA();
- }
- }
- public class B5 :A5
- {
- public new void MethodA()
- {
- Console.WriteLine("B5.MethodA");
- Console.ReadLine();
- }
- }
最後的答案是:"A5.MethodA"
介面 抽象類別 虛方法 三者比較-1