【问题标题】:Not grasping API using interfaces不使用接口掌握 API
【发布时间】:2012-02-01 13:54:52
【问题描述】:

我刚刚获得了一个似乎比我习惯的 API 更上一层楼的 API,因为一切似乎都是使用接口实现的,我正在努力理解它们。

public partial class Form1 : Form, IFoo
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Guid jobID = AddBarToFoo(fooID, barPath);
    }

    public Guid IFoo.AddBarToFoo(string fooID, string barPath)
    {
        throw new NotImplementedException();
    }

这是一个基本结构。 Visual Studio 已经很好地实现了整个接口,我可以调用 AddBarToFoo 方法。伟大的。

但是现在呢?显然,该方法是一个需要一些代码的空白,但是什么代码呢?我是否应该搜索 API 以使用该方法实例化对象?还是我完全走错了路?

【问题讨论】:

  • 它应该返回一个Guid,而不是void。基本上,“API”“知道”这个接口,并且可以调用实现它的类型的方法——它应该在规范中说明你期望什么/如何产生那个 Guid。
  • 代码可以是任何您想要的代码,具体取决于您的产品规格。

标签: c# interface notimplementedexception


【解决方案1】:

接口就是这样。他们只定义某人如何称呼他们。他们绝对没有说明该方法应该真正做什么,或者它应该如何做。这取决于实现接口的人来决定。

VS通过添加单行throw new NotImplementedException();来“实现”该方法,这实际上只是为了满足编译器。

这里有两种可能的(人为的)实现,它们做的事情完全不同。两者都实现IFoo

public class DbFoo:IFoo {
    public Guid IFoo.AddBarToFoo(string fooID, string barPath) {
        // this might add a Foo to the database and return its Guid
    }
}

public class ListBasedFoo:IFoo {
    public ListBasedFoo() { MyList = new List<Foo>(); }

    public List<Foo> MyList { get; private set; }

    public Guid IFoo.AddBarToFoo(string fooID, string barPath) {
        // this could add a Foo to MyList, and return some Guid to reference it
    }
}

编辑... 您会看到接口在抽象行为很重要的地方被大量使用,但实现可能会有所不同。例如,持久化对象的接口。在开发过程中,您可能希望使用一个将项目放入和获取到内存列表中的模拟。稍后您可能会使用通过 ADO .NET 或 Entity Framework 或 LINQ to SQL 直接访问数据库的接口。也许在应用程序生命周期的另一点上,会删除一个使用 WCF Web 服务的新实现。

我上面例子中的要点是调用代码不会中断。 interface 是满意的 - 只有行为发生了变化。

【讨论】:

  • 谢谢。这清楚地表明(以及其他 cmets)我对接口的理解并非完全错误,只是我已经获得了大部分代码库的文档,但其中只有一部分是实际的 API。没有什么比代码本身自动生成的文档(这是这家特定公司的标准),所以我不得不把它分开。感谢您在接口方面帮助我!非常感谢。
【解决方案2】:

Interface 是您将要签署的合同,在您实施它的那一刻。所以你在这个方法中应该做什么,这取决于你要对这个接口做什么。

public class MyFooImplementation:IFoo {
    public Guid IFoo.AddBarToFoo(string fooID, string barPath) {
        // do somethign and return GUID
    }
}

Visual Studio 好心地为您生成一个带有所需签名 的方法,但自然会推入NotImplementedException(),因为您仍然需要实现它。如果您忘记、解雇或其他任何事情,但没有在其中写入任何内容,那么您的类消费者在使用该方法时将获得该异常。

绝对正确的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    相关资源
    最近更新 更多