2016-11-07 4 views
2

SqlDataReader'sクラスステートメントが、これらは全てそのベースクラス、DbDataReaderによって実装されていてもたIDataReader、IDataRecordとIDisposableをしています。この場合クラスKeyword - 継承されたインタフェースを明示的に示していますか?

public class SqlDataReader : DbDataReader, 
    IDataReader, IDisposable, IDataRecord {...} 

public abstract class DbDataReader : MarshalByRefObject, 
    IDataReader, IDisposable, IDataRecord, IEnumerable {...} 

、派生クラスがどのそのインターフェースを実装することを示すにはいくつかの技術的な利点があります基本クラスはすでにそれが実装されていることを示していますか? (これは遺産の遺物、誤植、または文書化のために行われたものであるかどうか疑問に思う)

+0

あなたはこれを見ましたか? [referencesource.microsoft.com](https://referencesource.microsoft.com/#System.Data/System/Data/SqlClient/SqlDataReader.cs)サイトでこれを見ることはできません。 – Dmitry

+0

@Dmitry、両方ともに 'IDataReader'が定義されていますが、答えはいいえです。冗長なインターフェース宣言を追加する必要はありません。 –

+2

@KirkWoll明示的なインターフェイスの実装についてはどうですか? 'SqlDataReader'クラスには、IDataReader IDataRecord.GetData(int i)というクラスがあります。 – Dmitry

答えて

3

これは、派生クラスの明示的なインターフェイス実装を追加または上書きするために行うことができます。 Derived直接IFooを実装していない場合は、ベースクラスの実装をオーバーライドすることができないので、例えば、

interface IFoo 
{ 
    string P {get;} 
} 

class Base: IFoo 
{ 
    string IFoo.P 
    { 
     get { return "Base"; } 
    } 
} 

class Derived: Base, IFoo 
{ 
    string IFoo.P 
    { 
     get { return "Derived"; } 
    } 
} 

、それは、IFoo.Pの明示的な実装を定義することはできません。

0

これは、明示的にインターフェイスを実装したい場合に適しています。たとえば
:あなたはB宣言でISomeをコメントアウトした場合

interface ISome 
{ 
    void Method(); 
} 

class A : ISome 
{ 
    public void Method() 
    { 
    } 
} 

class B : A, ISome // Try to remove ISome... 
{ 
    void ISome.Method() 
    { 
    } 
} 

、コンパイルは失敗します。

関連する問題