什么是.net的接口和抽象類_.Net教程
教程Tag:暫無Tag,歡迎添加,賺取U幣!
推薦:10個(gè)ASP.NET編程技巧1、盡量減少表單回送 每當(dāng)點(diǎn)擊Web網(wǎng)頁上的Button、LinkButton或ImageButton控件時(shí),表單就會(huì)被發(fā)送到服務(wù)器上。如果控件的AutoPostBack屬性被設(shè)置為true,如果CheckBox、CheckBoxList等控件的狀態(tài)被改變后,也會(huì)使表單會(huì)發(fā)送回服務(wù)器。 每次當(dāng)表單被發(fā)送回服
什么是接口?接口是包含一組虛方法的抽象類型,其中每一種方法都有其名稱、參數(shù)和返回值。接口方法不能包含任何實(shí)現(xiàn),CLR允許接口可以包含事件、屬性、索引器、靜態(tài)方法、靜態(tài)字段、靜態(tài)構(gòu)造函數(shù)以及常數(shù)。但是注意:C#中不能包含任何靜態(tài)成員。一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,當(dāng)一個(gè)類繼承某個(gè)接口時(shí),它不僅要實(shí)現(xiàn)該接口定義的所有方法,還要實(shí)現(xiàn)該接口從其他接口中繼承的所有方法。
定義方法為:
| public interface System.IComparable { int CompareTo(object o); } public class TestCls: IComparable { public TestCls() { } private int _value; public int Value { get { return _value; } set { _value = value; } } public int CompareTo(object o) { //使用as模式進(jìn)行轉(zhuǎn)型判斷 TestCls aCls = o as TestCls; if (aCls != null) { //實(shí)現(xiàn)抽象方法 return _value.CompareTo(aCls._value); } } } |
什么是抽象類?
抽象類提供多個(gè)派生類共享基類的公共定義,它既可以提供抽象方法,也可以提供非抽象方法。抽象類不能實(shí)例化,必須通過繼承由派生類實(shí)現(xiàn)其抽象方法,因此對(duì)抽象類不能使用new關(guān)鍵字,也不能被密封。如果派生類沒有實(shí)現(xiàn)所有的抽象方法,則該派生類也必須聲明為抽象類。另外,實(shí)現(xiàn)抽象方法由overriding方法來實(shí)現(xiàn)。
定義方法為:
| /// /// 定義抽象類 /// abstract public class Animal { //定義靜態(tài)字段 static protected int _id; //定義屬性 public abstract static int Id { get; set; } //定義方法 public abstract void Eat(); //定義索引器 public string this[int i] { get; set; } /// /// 實(shí)現(xiàn)抽象類 /// public class Dog: Animal { public static override int Id { get {return _id;} set {_id = value;} } public override void Eat() { Console.Write("Dog Eats.") } } |
3. 相同點(diǎn)和不同點(diǎn)
3.1 相同點(diǎn)
都不能被直接實(shí)例化,都可以通過繼承實(shí)現(xiàn)其抽象方法。
都是面向抽象編程的技術(shù)基礎(chǔ),實(shí)現(xiàn)了諸多的設(shè)計(jì)模式。
3.2 不同點(diǎn)
接口支持多繼承;抽象類不能實(shí)現(xiàn)多繼承。
接口只能定義抽象規(guī)則;抽象類既可以定義規(guī)則,還可能提供已實(shí)現(xiàn)的成員。
接口是一組行為規(guī)范;抽象類是一個(gè)不完全的類,著重族的概念。
接口可以用于支持回調(diào);抽象類不能實(shí)現(xiàn)回調(diào),因?yàn)槔^承不支持。
接口只包含方法、屬性、索引器、事件的簽名,但不能定義字段和包含實(shí)現(xiàn)的方法;抽象類可以定義字段、屬性、包含有實(shí)現(xiàn)的方法。
接口可以作用于值類型和引用類型;抽象類只能作用于引用類型。例如,Struct就可以繼承接口,而不能繼承類。
通過相同與不同的比較,我們只能說接口和抽象類,各有所長,但無優(yōu)略。在實(shí)際的編程實(shí)踐中,我們要視具體情況來酌情量才,但是以下的經(jīng)驗(yàn)和積累,或許能給大家一些啟示,除了我的一些積累之外,很多都來源于經(jīng)典,我相信經(jīng)得起考驗(yàn)。所以在規(guī)則與場合中,我們學(xué)習(xí)這些經(jīng)典,最重要的是學(xué)以致用,當(dāng)然我將以一家之言博大家之笑,看官請(qǐng)繼續(xù)。
3.3 規(guī)則與場合
請(qǐng)記住,面向?qū)ο笏枷氲囊粋(gè)最重要的原則就是:面向接口編程。
借助接口和抽象類,23個(gè)設(shè)計(jì)模式中的很多思想被巧妙的實(shí)現(xiàn)了,我認(rèn)為其精髓簡單說來就是:面向抽象編程。
抽象類應(yīng)主要用于關(guān)系密切的對(duì)象,而接口最適合為不相關(guān)的類提供通用功能。
接口著重于CAN-DO關(guān)系類型,而抽象類則偏重于IS-A式的關(guān)系;
接口多定義對(duì)象的行為;抽象類多定義對(duì)象的屬性;
接口定義可以使用public、protected、internal 和private修飾符,但是幾乎所有的接口都定義為public,原因就不必多說了。
“接口不變”,是應(yīng)該考慮的重要因素。所以,在由接口增加擴(kuò)展時(shí),應(yīng)該增加新的接口,而不能更改現(xiàn)有接口。
盡量將接口設(shè)計(jì)成功能單一的功能塊,以.NET Framework為例,IDisposable、IDisposable、IComparable、IEquatable、IEnumerable等都只包含一個(gè)公共方法。
接口名稱前面的大寫字母“I”是一個(gè)約定,正如字段名以下劃線開頭一樣,請(qǐng)堅(jiān)持這些原則。
在接口中,所有的方法都默認(rèn)為public。
如果預(yù)計(jì)會(huì)出現(xiàn)版本問題,可以創(chuàng)建“抽象類”。例如,創(chuàng)建了狗(Dog)、雞(Chicken)和鴨(Duck),那么應(yīng)該考慮抽象出動(dòng)物(Animal)來應(yīng)對(duì)以后可能出現(xiàn)風(fēng)馬牛的事情。而向接口中添加新成員則會(huì)強(qiáng)制要求修改所有派生類,并重新編譯,所以版本式的問題最好以抽象類來實(shí)現(xiàn)。
從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實(shí)現(xiàn)。
對(duì)抽象類不能使用new關(guān)鍵字,也不能被密封,原因是抽象類不能被實(shí)例化。
在抽象方法聲明中不能使用 static 或 virtual 修飾符。
4. 經(jīng)典示例
4.1 絕對(duì)經(jīng)典
.NET Framework是學(xué)習(xí)的最好資源,有意識(shí)的研究FCL是每個(gè).NET程序員的必修課,關(guān)于接口和抽象類在FCL中的使用,我有以下的建議:
FCL對(duì)集合類使用了基于接口的設(shè)計(jì),所以請(qǐng)關(guān)注System.Collections中關(guān)于接口的設(shè)計(jì)實(shí)現(xiàn);
FCL對(duì)數(shù)據(jù)流相關(guān)類使用了基于抽象類的設(shè)計(jì),所以請(qǐng)關(guān)注System.IO.Stream類的抽象類設(shè)計(jì)機(jī)制。
4.2 別樣小菜
下面的實(shí)例,因?yàn)槭俏业睦斫猓虼私o經(jīng)典打上“相對(duì)”的記號(hào),至于什么時(shí)候晉升為“絕對(duì)”,就看我在.NET追求的路上,是否能夠一如既往的如此執(zhí)著,因此我將把相對(duì)重構(gòu)到絕對(duì)為止(呵呵)。 本示例沒有闡述抽象類和接口在設(shè)計(jì)模式中的應(yīng)用,因?yàn)槟菍⑹橇硪黄杏懻搩r(jià)值的文本,本文著眼與概念和原則的把握,但是真正的應(yīng)用來自于具體的需求規(guī)范。
分享:asp.net回發(fā)或回調(diào)參數(shù)無效解決方法首先,這個(gè)問題出現(xiàn)在asp.net2.0中,我是在做一個(gè)二級(jí)菜單出現(xiàn)了這個(gè)問題 , 該功能用javascript改變DrownDownList內(nèi)容后再提交就出現(xiàn)這個(gè)錯(cuò)誤, 總結(jié) 網(wǎng)上的解決 回發(fā)或回調(diào)參數(shù)無效 方法主要有: 一是在前臺(tái)aspx頁中設(shè)置 %@ Page Language=C# EnableEv
相關(guān).Net教程:
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(連接字符串的配置及獲取)
- asp.net頁面?zhèn)髦禍y試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過程實(shí)現(xiàn)分頁示例代碼
- 相關(guān)鏈接:
- 教程說明:
.Net教程-什么是.net的接口和抽象類
。