2016-11-07 23 views
2

SqlDataReader's類的語句包含的IDataReader,IDataRecord和IDisposable的,即使這些都是其基類中實現,DbDataReader類關鍵字 - 顯式指示繼承的接口?

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

這可以通過添加或重寫派生類中的顯式接口實現來完成。例如,

interface IFoo 
{ 
    string P {get;} 
} 

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

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

如果Derived不直接實現IFoo,它不能定義一個明確的實施IFoo.P,所以不能重寫基類的實現。

0

如果你想明確地實現一些接口,這是有道理的。
例如:

interface ISome 
{ 
    void Method(); 
} 

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

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

如果您在B聲明註釋掉ISome,編譯將失敗。