2012-04-27 7 views
2

インターネット上の文の2種類を約Interfaceあり、それはInterfaceは継承チェーンに入っていますか?

インタフェースはチェーンを継承して来ていない
声明です。

他の文のB

Interfaces can inherit other interfaces

これら二つは声明を矛盾しています。

どちらが正しいか教えてください。

+1

インターフェイスは、継承チェーンに表示されますが、それらを実装するクラスの継承チェーンには表示されません。 – Servy

答えて

5

これらはどちらも真実です。

ステートメントA:インターフェイスは厳密に継承しません。インターフェイスを実装しているクラスがあり、

と答えた場合
base. 

インターフェイスのメンバーは表示されません。

ステートメントB:これは、「インターフェイスは他のインターフェイスを実装できます」と読みやすくなります。実装チェーンを持つことができます。彼らは本当に継承していません。

+0

私はあなたに同意します。この混乱は、「相続」という言葉によってもたらされます。 – jams

+0

@jams:インターフェースは実際には何も実装していません。 「継承」という用語が完全に適切であるかどうかについて論じることはできますが、「実装する」よりも不正確ではありません。要点は、「class1:class2」、「class:interface」、および「interface1:interface2」は基本的に3つの異なる種類の関係を表していることです。三種類の関係を記述するために二つの用語を使用する場合、私の好みは、クラスの世界では、 "継承"は一つのことを意味するということです。インターフェースの世界では、別のインターフェースを意味します。世界を渡るときは適用されません。 – supercat

5

インターフェイスは他のインターフェイスを継承して試してみると、動作することがわかります。

+0

文Aが間違っています。 – jams

+2

はい。また、一般に、他の情報源よりもMSDNに関する情報を信頼することができます。 –

+0

ステートメントAは意味をなさない。あなたはどこでそれを読んだのですか? –

1

.NETの世界では、インターフェイスは他のインターフェイスを絶対に継承できます。実装クラスは、継承するすべてのインタフェースのすべてのメソッドとプロパティを実装することが期待されます。

名前の矛盾がある場合、実装クラスはexplicit interface implementationsを使用する必要があります。

2

どちらの文も正しいです。

2番目のステートメントは正しいです。 InterfaceA:InterfaceBは完全に上手く、InterfaceAを実装しているクラスもInterfaceBを継承しなければなりません。

「継承チェーンが継承しない」とは、DerivedClass:BaseClass、InterfaceAの場合、base.BaseClassMethodを使用してDerivedClassからBaseClassメンバーにアクセスでき、同じ方法でbase.InterfaceAMethodを呼び出すことができないことを意味します。インターフェイスは継承チェーンの一部ではないためです。むしろ、それらのメンバーは多型性を介してアクセス可能である。

1

これらはどちらもC#で可能であるため、どちらも真です。私たちは、インターフェイス鎖を有するget surprisedにしたくない

これを考えてみましょう、

interface IFileRepository : IDisposable { ... } 

これが言うには、IDisposableを実装しなければなりません。しかし、私はFileRepositoryを書くことができます。FileRepositoryはリソースを処分する必要がないかもしれません。またはユニットテスト中の別の例では、依存関係として使用するクラスに対してFileRepository-スタブを書きますが、少なくともメソッドIをテストすると、Dispose()はまったく呼び出されません。それでも、IDisposableを実装する必要があります。

クリーンデザインでは、このような実装を指示すべきではありません。具体的な実装では、何を提供するかを知っている必要があります。

class FileRespository : IFileRepository , IDisposable { ... } 
関連する問題