介面 四 訪問介面

2021-04-20 06:53:07 字數 1307 閱讀 1013

對介面成員的訪問

對介面方法的呼叫和採用索引指示器訪問的規則與類中的情況也是相同的。如果底層成員的命名與繼承而來的高層成員一致,那麼底層成員將覆蓋同名的高層成員。但由於介面支援多繼承,在多繼承中,如果兩個父介面含有同名的成員,這就產生了二義性(這也正是c#中取消了類的多繼承機制的原因之一),這時需要進行顯式的定義:

第四節、訪問介面

對介面成員的訪問

對介面方法的呼叫和採用索引指示器訪問的規則與類中的情況也是相同的。如果底層成員的命名與繼承而來的高層成員一致,那麼底層成員將覆蓋同名的高層成員。但由於介面支援多繼承,在多繼承中,如果兩個父介面含有同名的成員,這就產生了二義性(這也正是c#中取消了類的多繼承機制的原因之一),這時需要進行顯式的定義:

using system ;

inte***ce isequence

}inte***ce iring

inte***ce iringsequence: isequence, iring

class ctest

}上面的例子中,前兩條語句rs .count(1)和rs .count = 1會產生二義性,從而導致編譯時錯誤,因此必須顯式地給rs 指派父

介面型別,這種指派在執行時不會帶來額外的開銷。

再看下面的例子:

using system ;

inte***ce iinteger

inte***ce idouble

inte***ce inumber: iinteger, idouble {}

class cmytest

}呼叫num.add(1) 會導致二義性,因為候選的過載方法的引數型別均適用。但是,呼叫num.add(1.0) 是允許的,因為1.0 是浮點數引數型別與方法iinteger.add()的引數型別不一致,這時只有idouble.add 才是適用的。不過只要加入了顯式的指派,就決不會產生二義性。

介面的多重繼承的問題也會帶來成員訪問上的問題。例如:

inte***ce ibase

inte***ce ileft: ibase

inte***ce iright: ibase

inte***ce iderived: ileft, iright

class ctest

}上例中,方法ibase.fway在派生的介面ileft中被ileft的成員方法fway覆蓋了。所以對d. fway (1)的呼叫實際上呼叫了。雖然從ibase-> iright-> iderived這條繼承路徑上來看,ileft.fway方法是沒有被覆蓋的。我們只要記住這

一點:一旦成員被覆蓋以後,所有對其的訪問都被覆蓋以後的成員"攔截"了。

訪問介面1

第四節 訪問介面 對介面成員的訪問 對介面方法的呼叫和採用索引指示器訪問的規則與類中的情況也是相同的。如果底層成員的命名與繼承而來的高層成員一致,那麼底層成員將覆蓋同名的高層成員。但由於介面支援多繼承,在多繼承中,如果兩個父介面含有同名的成員,這就產生了二義性 這也正是c 中取消了類的多繼承機制的原...

訪問介面1

第四節 訪問介面 對介面成員的訪問 對介面方法的呼叫和採用索引指示器訪問的規則與類中的情況也是相同的。如果底層成員的命名與繼承而來的高層成員一致,那麼底層成員將覆蓋同名的高層成員。但由於介面支援多繼承,在多繼承中,如果兩個父介面含有同名的成員,這就產生了二義性 這也正是c 中取消了類的多繼承機制的原...

介面訪問許可權

1.盡可能使每個類或者成員不被外界訪問 2.如果方法覆蓋了超類中的乙個方法,子類中的訪問級別就不允許低於超類中的訪問級別,這樣可以確保任何可使用超類的例項的地方也都可以使用子類的例項。3.公有類的例項域絕不能是公有的。但是有乙個特例 類的成員域由靜態final常量構成,可以公有的靜態final域來暴...