2012-02-01 27 views
3

我刚刚交付了一个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以使用该方法实例化吗?或者我完全走错了路?

+0

它应该返回一个'Guid',它不是'void'。基本上,'API''知道'这个接口,并且可以调用实现它的类型的方法 - 它应该在规范中说明你希望如何生成该Guid。 – 2012-02-01 13:56:45

+0

代码可以是任何你想要的,这取决于你的产品规格。 – JConstantine 2012-02-01 13:57:03

回答

4

这是接口的东西。他们只定义某人会怎样称呼他们。他们绝对说没有什么关于该方法应该做什么,或者应该怎么做。这取决于实现界面来决定的人员。

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或实体框架或LINQ to SQL直接访问数据库的界面。也许在应用程序生命周期的另一个时刻,新的实现将被删除,而不是使用WCF Web服务。

我上面的例子中的点是调用代码不会中断。 接口得到满足 - 只有行为已被更改。

+0

谢谢。这一点(和其他评论)明确表示,我对接口的理解并不完全错误,只是我已经为大多数代码库提供了文档,但只有一部分是实际的API。除了代码本身自动生成的文档外(这是这家公司的标准),所以我不得不将它分开。感谢您帮助我与接口,但!非常感激。 – 2012-02-01 14:44:59

1

Interface是你打算签约的合同,你在执行的那一刻吧。所以你应该在这个方法中做什么,这取决于你要用这个接口做什么。

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

Visual Studio你好心产生与所需签名的方法,但是把里面,自然,NotImplementedException(),因为你neeed仍然实现它。如果你忘了,解雇或者其他任何东西,但是不要在里面写任何东西,那么在使用这个方法的时候,你的类的使用者会得到这个异常。

绝对正确的行为。