2016-11-07 3 views
2

SqlDataReader's Klasse Anweisung enthält IDataReader, IDataRecord und IDisposable obwohl diese alle durch seine Basisklasse implementiert sind, DbDataReader: Klassenschlüsselwort - explizite Angabe von vererbten Schnittstellen?

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

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

In diesem Fall

gibt es einige technische Vorteil darauf hinweist, dass die abgeleitete Klasse Schnittstellen implementiert, die ihre Basisklasse zeigt bereits an, dass es implementiert? (Ich frage nicht, ob es sich um ein Legacy-Relikt, einen Tippfehler oder etwas zu Dokumentationszwecken handelt.)

+0

Wo hast du das gesehen? Kann nicht auf der Website [referencesource.microsoft.com] (https://referencesource.microsoft.com/#System.Data/System/Data/SqlClient/SqlDataReader.cs) angezeigt werden. – Dmitry

+0

@Dmitry, gut 'IDataReader' ist in beiden definiert, aber die Antwort ist nein, es gibt keinen Grund, redundante Interface-Deklarationen hinzuzufügen. –

+2

@KirkWoll Was ist mit expliziter Schnittstellenimplementierung? In der 'SqlDataReader'-Klasse gibt es einen:' IDataReader IDataRecord.GetData (int i) '. – Dmitry

Antwort

3

Dies könnte getan werden, um explizite Schnittstellenimplementierungen in der abgeleiteten Klasse hinzuzufügen oder zu überschreiben. Zum Beispiel

interface IFoo 
{ 
    string P {get;} 
} 

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

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

Wenn Derived nicht IFoo direkt nicht implementiert, kann es keine explizite Implementierung von IFoo.P, definieren, so kann es nicht die Umsetzung in der Basisklasse außer Kraft setzen.

0

Dies ist sinnvoll, wenn Sie eine Schnittstelle explizit implementieren möchten.
Zum Beispiel:

interface ISome 
{ 
    void Method(); 
} 

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

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

Wenn Sie die ISome in der B Erklärung kommentieren Sie wird Kompilierung fehlschlagen.

Verwandte Themen