深入繼承 抽象類和介面

2021-06-06 05:21:20 字數 3301 閱讀 3360

抽象方法:當類中的方法在宣告的時候加上 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 可以完全用介面來替換抽象類。其實不然,介面和抽象類各有長處和缺陷,因此往往在應用當中,兩者要結合來使用,...