參考文章:http://www.cftea.com/c/2012/03/5522.asp;http://blog.sina.com.cn/s/blog_4aaeba510100c4y6.html
1、抽象方法:好處:靈活的實現代碼的重用,子類重寫(override); 抽象的目的是我沒法實現它,由繼承個人類來實現
一、a、抽象類的方法必須是抽象方法,否則報錯;
b、屬性不必定要為抽象屬性。
二、a、一個類只能繼承一個抽象類;
b、abstract 與private、virtual、static不能同時使用;
c、抽象類不能實例化。
三、抽象類的抽象方法、抽象屬性在其通常子類中必須重寫(重寫訪問性要一致),且抽象屬性的讀、寫情況要一致。
四、抽象類的抽象方法、抽象屬性在其抽象子類中不必定要重寫,但重寫的必須要實現,未重寫的在其子類中必須重寫實現。
五、繼承抽象類的子類能夠再次重寫繼承抽象類繼承的方法屬性。
六、不能對字段抽象(由於字段只能用等號賦值,沒其餘代碼(不一樣於屬性),沒啥抽象的意義)。
例子:html
public abstract class PhoneAbsstract//抽象類的方法必須是抽象方法,否則報錯;屬性不必定要為抽象屬性。 { public abstract void 通話(); public abstract void 照相(); public abstract void 上網(); private int _size = 0; public int size { get { return _size; } set { _size = size; } } public abstract int weight { get;} } public class Phone1 : PhoneAbsstract//抽象類的抽象方法、抽象屬性在其通常子類中必須重寫(重寫訪問性要一致),且抽象屬性的讀、寫情況要一致。 { public override void 通話() { Console.Write("我能夠打電話。"); } public override void 照相() { Console.Write("我能夠打照相。"); } public override void 上網() { Console.Write("我能夠上網。"); } private int _weight = 0; public override int weight { get { return _weight; } } } public abstract class IPhoneAbstract : PhoneAbsstract//抽象類的抽象方法、抽象屬性在其抽象子類中不必定要重寫,但重寫的必須要實現 { public override void 通話() { Console.Write("IPhone手機能夠打電話。"); } public override void 上網() //繼承抽象類的子類能夠再次重寫繼承抽象類繼承的方法屬性。 { Console.Write("IPhone手機能夠上網。"); } private int _weight = 0; public override int weight { get { return _weight; } } } public class IPhone1 : IPhoneAbstract//未重寫的在其子類中必須重寫實現 { public override void 上網() { Console.Write("IPhone手機能夠上網。"); } public override void 照相() { Console.Write("IPhone手機能夠照相。"); } }
2、接口:實現多態; 接口的目的是提供一個標準讓你們來遵照,不用知道你們如何實現;簡單工廠模式應用(利用多態);
一、接口只能是public,實現接口也必須public;
二、能實現多個接口,但繼承的全部接口的方法必須都要實現;
例子:簡單工廠模式ide
class Program { static void Main(string[] args) { phone2 p2=new phone2(); camera c = new camera(); SimplenessFactory.照相(p2); SimplenessFactory.照相(c); Console.Read(); } } public class SimplenessFactory//簡單工程模式應用接口 { public static void 照相(照相設備接口 photo) { photo.照相(); } } public interface 通話設備接口//接口只能public { void 通話(); } public interface 照相設備接口 { void 照相(); int size { get; } } public interface 上網設備接口 { void 上網(); } public class phone1 : 通話設備接口//實現接口的類必須public { public void 通話()//必須public { Console.WriteLine("電話1打電話了。"); } } public class phone2 : 通話設備接口, 照相設備接口, 上網設備接口//能實現多個接口,但繼承的全部接口的方法必須都要實現 { public void 通話() { Console.WriteLine("電話2打電話了。"); } public void 照相() { Console.WriteLine("電話2照相了。"); } public void 上網() { Console.WriteLine("電話2上網了。"); } public int size { get { return 100; } }//屬性也必須實現,其必須是public } public class camera : 照相設備接口 { public void 照相() { Console.WriteLine("相機照相了。"); } public int size { get { return 200; } }//屬性也必須實現,其必須是public }
3、抽象類與接口區別:
一、一個類一次能夠多個接口,但只能實現一個抽象類。
二、抽象類實現的具體方法默認爲虛的,但實現接口的類中的接口方法卻默認爲非虛的,固然您也能夠聲明爲虛的
三、(接口)與非抽象類相似,抽象類也必須爲在該類的基類列表中列出的接口的全部成員提供它本身的實現。可是,容許抽象類將接口方法
映射到抽象方法上。
四、好的接口定義應該是具備專注功能性的,而不是多功能的,不然形成接口污染。
4、抽象類和接口的使用:spa
1. 若是預計要建立組件的多個版本,則建立抽象類。抽象類提供簡單的方法來控制組件版本。設計
2.若是建立的功能將在大範圍的全異對象間使用,則使用接口。若是要設計小而簡練的功能塊,則使用接口。code
3.若是要設計大的功能單元,則使用抽象類.若是要在組件的全部實現間提供通用的已實現功能,則使用抽象類。htm
4.抽象類主要用於關係密切的對象;而接口適合爲不相關的類提供通用功能。對象
如下是我在網上看到的幾個形象比喻,真的很是不錯,呵呵:blog
1.飛機會飛,鳥會飛,他們都繼承了同一個接口「飛」;可是F22屬於飛機抽象類,鴿子屬於鳥抽象類。繼承
2. 就像鐵門木門都是門(抽象類),你想要個門我給不了(不能實例化),但我能夠給你個具體的鐵門或木門(多態);並且只能是門,你不能說它是窗(單繼承);一個門能夠有鎖(接口)也能夠有門鈴(多實現)。門(抽象類)定義了你是什麼,接口(鎖)規定了你能作什麼(一個接口最好只能作一件事,你不能要求鎖也能發出聲音吧(接口污染)。接口