2016-11-07 48 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,编译将失败。