抽象方法:當類中的方法在宣告的時候加上 abstract 關鍵字的時候,稱為abstract method ,但是只有在抽象類和介面中才可以使用抽象方法。
舉個例子:
public abstract class person
public abstract string getmore();
//定義乙個抽象的方法
}public class richgril : person
public override string getmore()
}public class poorgril : person
public override string getmore()
}
介面:他呢其實也是一種特殊的抽象類,用 inte***ce 關鍵字標記,他的定義沒有 class 關鍵字,他可以包含 方法和屬性和事件,但是方法也只能是抽象方法,任何派生於該介面的類就必須提供執行的**.任何介面成員前面都不能加修飾符.
介面可用的修飾符有 new , public ,protected , internal , private ,但是同一宣告中修飾符只能有乙個,new關鍵字只能出現在鑲套介面中,表示複寫繼承來的同名成員.
介面和類一樣,可以被繼承和發展,但不同的是,類繼承不僅說明繼承也會實現繼承,但是介面繼承只是說明繼承,通俗的說,派生類可以繼承基類的方法實現,而派生介面只是繼承父介面的方法說明,卻沒有繼承父介面的實現.
這是乙個簡單的介面例子:
inte***ce firstdemo //宣告第乙個介面
public class c : firstdemo
}
1、介面的繼承並不是只繼承乙個介面,如果是說繼承的介面如果還有父介面怎麼辦?
在這個演示中我們主要說明乙個問題,就是如果繼承了有父介面的介面,那麼也必須實現他全部父介面的方法和屬性
inte***ce i_2_a //宣告第乙個介面
//宣告乙個屬性
}inte***ce i_2_b //宣告第二個介面
inte***ce i_2_c : i_2_a, i_2_b //宣告第三個介面又繼承了前兩個介面
//什麼都沒有宣告。但是他實際上是繼承了前面兩個介面的屬性和方法。
public class i_2_l : i_2_c //宣告乙個類,他繼承了i_2_c這個介面
set
}public int count(int i, int j)
}
2、外部對介面的訪問,如果出現同名的引數或者方法,必須顯示的指出他的父介面。
public inte***ce i_3_a
int j(int j);
}public inte***ce i_3_b
public inte***ce i_3_c : i_3_a, i_3_b
public class i_3_l
}
3、外部類中對多重繼承中的成員訪問問題
public inte***ce i_4_a
public inte***ce i_4_b : i_4_a
public inte***ce i_4_c : i_4_a
/// /// 下面這個介面我們需要注意一下,他繼承了b 和 c ,但是這兩個有同時繼承了 a
/// 不同的是,他們兩個介面在內部定義的時候又採取了不同的策略,我們的訪問該是如何的呢?
///
public inte***ce i_4_d : i_4_b, i_4_c ;
public class i_4_l
}
4、 本例我們說明三個問題,一是顯示的實現介面
被顯示實現的介面成員不能被從類例項訪問. 因為不能在類例項中訪問,但是在類內部是可以的吧,當類的使用者不需要使用到這個介面成員的時候
這個特性就特別有用了
另外如果多個介面之間有同名成員的時候,這個就特別有用了
要顯示呼叫的話就必須繼承介面
public inte***ce i_5_a
double price
string x_more();
string more();
}public class i_5_l : i_5_a
#region i_5_a 成員
string i_5_a.name //顯示實現的屬性,顯示宣告也沒必要用到修飾符
set
}public double price
set
}string i_5_a.x_more() //顯示實現的方法
public string more()
#endregion
}5、使用override關鍵字實現進行複寫
public class i_6_l_2 : i_6_l_1,i_6_a
string i_6_a.getname()
}/// /// 這個類也繼承了i_6_l_1 這個類,而且使用override關鍵字對i_6_l_1 中的方法實現進行複寫
/// 所以當呼叫的時候,結果自然可想而知了
///
public class i_6_l_3 : i_6_l_1
public override string getname()
}/// /// 這個類很顯然古怪出在對方法的實現上,他使用了new關鍵字
/// 不是複寫的問題,更嚴重了,根本就是把父類的實現給覆蓋了
///
public class i_6_l_4 : i_6_l_1
public new string getname()
}
6、對映:
public inte***ce i_7_a
public inte***ce i_7_b
//這裡我們需要注意的是,上面 a 和b 都有乙個成員方法
public class i_7_l:i_7_a,i_7_b
#endregion
#region i_7_b 成員
string i_7_b.g()
#endregion
}
還有就是我們需要關於虛方法,override 和 new的一些繼承問題,因為虛方法和override和new的用法有所不同,一篇部落格無法介紹清楚,所以放在單獨的一篇部落格。
抽象類 介面 繼承
抽象類 抽象類提供多個派生類共享基類的公共定義,它既可以提供抽象方法,也可以提供非抽象方法。抽象類不能例項化,必須通過繼承由派生類實現其抽象方法,因此對抽象類不能使用new關鍵字,也不能被密封。如果派生類沒有實現所有的抽象方法,則該派生類也必須宣告為抽象類。否則,必須實現抽象類的方法和屬性,實現抽象...
繼承 多型 抽象類 介面
繼承 這個世界到處是繼承的例子比如動物是乙個最基礎的物件,人 豬 貓貓 狗狗都從動物繼承了基本的屬性和方法。繼承就是乙個層次結構,先抽象出乙個基本的東西,然後具體的物件從這個基本的東西來繼承,繼承後再寫他特有的,這樣就可以做到復用了。隱藏 如果基類和繼承類裡有一樣的方法,在子類裡呼叫的時候會怎麼樣,...
繼承之介面和抽象類區別
介面 inte ce 抽象類 abstract classic net 提供了介面,這個不同於 class 或者struct 的型別定義。介面有些情況,看似和抽象類一樣,因此有些人認為在 net 可以完全用介面來替換抽象類。其實不然,介面和抽象類各有長處和缺陷,因此往往在應用當中,兩者要結合來使用,...