2016-12-30 1 views
6

実装クラスのメソッド名の前にインタフェース参照が含まれる理由はありますか?たとえば、ReportService:IReportServiceメソッドとGetReport(int reportId)メソッドがあるとします。私はいくつかのコードをレビューして、別の開発者がReportServiceの中で、このようなメソッドを実装し:実装クラスのメソッド名の前にインタフェース参照が含まれる理由は何ですか?

Report IReportService.GetReport(int reportId) 
{ 
    //implementation 
} 

は私が前に、このようなサービスの実装を見たことがありません。それはどんな目的にも役立ちますか?

+0

実装クラスに同じシグネチャを持つメソッドがある場合は、区別できるようにしてください。 – Tobias

+0

明示的なインターフェイスの実装では、可視性修飾子を使用できません。私はあなたの質問に単純に間違って入力したと思うので、先に進んで編集しました。もしあなたが私が間違っていると思うならば、あなたは '公衆が本当にそこにいると思うならば、元気に戻すことができますが、あなたが持っていたものはコンパイルできません。 – hvd

答えて

12

これは「明示的なインタフェースの実装」と呼ばれます。この理由は、たとえば命名の競合である可能性があります。

インターフェイスIEnumerableIEnumerable<T>を考えてみましょう。そこだけ戻り値の型が異なる同じ名前の2つのメソッドを持つことが許されていないC#では

IEnumerator<T> GetEnumerator(); 

:一つは、非ジェネリックメソッド

IEnumerator GetEnumerator(); 

と一般的な一つの他を宣言します。明示的に実装されたインタフェースのメソッドは、インスタンス変数に呼び出すことはできません

public class MyEnumerable<T> : IEnumerable, IEnumerable<T> 
{ 
    public IEnumerator<T> GetEnumerator() 
    { 
     ... // return an enumerator 
    } 

    // Note: no access modifiers allowed for explicit declaration 
    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); // call the generic method 
    } 
} 

MyEnumerable<int> test = new MyEnumerable<int>(); 
var enumerator = test.GetEnumerator(); // will always call the generic method. 

あなたが非を呼び出したい場合は、両方のインターフェイスを実装するのであれば、あなたは明示的な一つの方法を宣言する必要があります一般的な方法では、testIEnumerableにキャストする必要があります。

((IEnumerable)test).GetEnumerator(); // calls the non-generic method 

これは、明示的な実装ではアクセス修飾子(publicprivateなど)が許可されていない理由のようです。

+0

また、公開されていないものを実装するために明示的にインターフェイスから実装することもできます(別の理由もあります)。 –

+0

@ M.kazemAkhgary確かに。 publicクラスが内部インタフェースを実装し、内部インタフェースが内部戻り型のメソッドを宣言している場合、publicクラス*はそれをpublicメソッドとして実装できません。明示的なインタフェース実装に頼る必要があります。 – hvd

関連する問題