【问题标题】:Method return an interface方法返回一个接口
【发布时间】:2010-10-05 09:42:53
【问题描述】:

大家好,

我在想这行代码

IDataReader myReader = questDatabase.ExecuteReader(getQuest);

我正在使用 DAAB,但我不明白 ExecuteReader(DbCommand) 方法返回 IDataReader 接口这一事实的方式和含义。

任何人都可以解释一下,请

【问题讨论】:

  • 我正在学习界面并且有完全相同的问题。 Pablito 的回答正是我正在寻找的,并确认我正在正确地构建我的实现。谢谢大家!!

标签: c# .net oop interface


【解决方案1】:

它返回一个接口,因为接口的实现并不重要,只需要接口提供的 API。

【讨论】:

  • 我真的很感谢你们,你们的奉献精神让我感到惊讶,很高兴能在这样的社区。谢谢大家
【解决方案2】:

“返回一个接口”真正的意思是:

返回实现该接口的某个类的实例

在这种情况下,它返回一个与SqlDataReader 对象非常相似的对象,它允许您执行Read() 之类的方法并实现IDisposableIDataRecord 接口。

【讨论】:

  • 我真的很感谢你们,你们的奉献精神让我感到惊讶,很高兴能在这样的社区。谢谢大家
  • 这和多态是不是一个类似的概念(即一个Object指针可以指向任何继承自Object的引用类型?
【解决方案3】:

它本身不是返回一个接口,而是一个支持该接口的对象。

【讨论】:

  • 我真的很感谢大家,我对你们的奉献感到惊讶,很高兴能在这样的社区。谢谢大家
【解决方案4】:

该方法将返回一个对象,该对象是一个类的实例,该类将支持IDataReader

关键是,对象的类型并不重要,重要的是类实现了接口。

如果您正在驾驶汽车,则无需知道是福特还是丰田,您以同样的方式驾驶汽车。

驾驶界面是一样的,只要车子支持这个界面,就可以驾驶了。

同上IDataReader,一旦返回的类支持接口,就可以使用了。

【讨论】:

    【解决方案5】:

    它返回一个实现这个特定接口的对象,这就是你真正关心的。对象是IDataReader,可以执行IDataReader的所有方法。

    【讨论】:

    • 我真的很感谢你们,你们的奉献精神让我感到惊讶,很高兴能在这样的社区。谢谢大家
    • 这就是我喜欢 StackOverflow 的原因:p
    【解决方案6】:

    它允许您使用 DataReader 而无需知道您正在使用哪种类型的 DataReader(即SqlDataReader, OleDbDataReader, EtcDataReader),因此如果有一天您想更改正在使用的数据读取器,它不会影响您的逻辑,在其他方面它给你的词是抽象的。 例如:

    你可以使用

    IDbCommand command = GiveMeSomeCommand();
    IDataReader r = command.ExecuteReader();
    

    不知道您使用的是哪个提供商

    可以是:

    private static IDbCommand GiveMeSomeCommand()
    {
        return new OleDbCommand();
    }
    

    也可以

    private static IDbCommand GiveMeSomeCommand()
    {
        return new SqlCommand();
    }
    

    或其他。

    编辑:

    您也可以使用 DBFactories。

    DbProviderFactory factory = GiveMeSomeFactory();
    IDbCommand command = factory.CreateCommand();
    IDataReader r = command.ExecuteReader();
    
    //and create more objects
    IDataAdapter adapter = factory.CreateDataAdapter();
    IDbConnection conn = factory.CreateConnection();
    

    然后在其他层创建你的提供者

    private DbProviderFactory GiveMeSomeFactory()
    {
        if(something)
            return SqlClientFactory.Instance;
        else if(somethingElse)
            return OracleFactory.Instance;
        else if(notThisAndNotThat)
            return MySqlFactory.Instance;
        else
            return WhateverFactory.Instance;
    
    }
    

    【讨论】:

    • 我真的很感谢你们,你们的奉献精神让我感到惊讶,很高兴能在这样的社区。谢谢大家
    猜你喜欢
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多