C# 不掌握使用接口的API
我刚刚收到一个API,它似乎比我习惯的API有了一个进步,因为所有的东西似乎都是用接口实现的,我正努力想弄清楚它们C# 不掌握使用接口的API,c#,interface,notimplementedexception,C#,Interface,Notimplementedexception,我刚刚收到一个API,它似乎比我习惯的API有了一个进步,因为所有的东西似乎都是用接口实现的,我正努力想弄清楚它们 public partial class Form1 : Form, IFoo { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Guid jobID = A
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();
}
这是一个基本结构。VisualStudio已经完整地实现了接口,我可以调用AddBarToFoo方法。太好了
但是现在呢?显然,这个方法是一个空白,需要一些代码,但是什么代码呢?我是否应该在API中搜索要用该方法实例化的对象?还是我完全走错了路 接口就是这样。它们只定义了人们将如何称呼它们。他们对该方法真正应该做什么,或者应该如何做,完全没有说什么。这由实现接口的人员决定 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
}
}
公共类DbFoo:IFoo{
公共Guid IFoo.AddBarToFoo(字符串fooID,字符串barPath){
//这可能会将Foo添加到数据库并返回其Guid
}
}
公共类ListBasedFoo:IFoo{
public ListBasedFoo(){MyList=new List();}
公共列表MyList{get;private set;}
公共Guid IFoo.AddBarToFoo(字符串fooID,字符串barPath){
//这可以将一个Foo添加到MyList中,并返回一些Guid来引用它
}
}
编辑。。。在抽象行为很重要的地方,您会看到大量使用的接口,但实现可能会有所不同。例如,用于持久化对象的接口。在开发过程中,您可能希望使用一个mock,将项目放入并获取到内存中的列表中。稍后,您可能会使用一个接口,通过ADO.NET或Entity Framework或LINQ to SQL直接访问数据库。也许在应用程序生命周期的另一个点上,会出现一个使用WCF web服务的新实现
我上面示例中的要点是调用代码不会中断。接口已满足-只有行为已更改。接口
是您将在实施时签署的合同。所以在这个方法中你应该做什么,这取决于你要用这个接口做什么
public class MyFooImplementation:IFoo {
public Guid IFoo.AddBarToFoo(string fooID, string barPath) {
// do somethign and return GUID
}
}
visualstudio
很乐意为您生成一个具有所需签名的方法,但自然地将NotImplementedException()
推到内部,因为您仍然需要实现它。如果您忘记、忽略或其他任何内容,但没有在其中写入任何内容,那么您的类使用者在使用该方法时将得到该异常
绝对正确的行为。它应该返回一个Guid
,而不是void
。基本上,“API”“知道”此接口,并且可以调用实现该接口的类型的方法-它应该在规范中,说明您希望生成该Guid的内容/方式。根据您的产品规范,代码可以是您想要的任何内容。谢谢。这清楚地表明(以及其他评论)我对接口的理解并不是完全错误的,只是我得到了大部分代码库的文档,但其中只有一部分是实际的API。没有什么比从代码本身自动生成的文档更重要的了(这是这个特定公司的标准),所以我不得不把它分开。谢谢你在界面方面的帮助!非常感谢。