我刚刚获得了一个似乎比我习惯的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 :(得分: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或Entity Framework或LINQ to SQL直接命中数据库的接口。也许在应用程序生命周期的另一个点上,将删除使用WCF Web服务的新实现。
上面示例中的要点是调用代码不会中断。 接口已满足 - 只有行为已更改。
答案 1 :(得分:1)
Interface
是您在实施时签署的合同。那么你应该在这种方法中做什么,这取决于你将如何处理这个界面。
public class MyFooImplementation:IFoo {
public Guid IFoo.AddBarToFoo(string fooID, string barPath) {
// do somethign and return GUID
}
}
Visual Studio
为您生成一个带有必需签名的方法,但是自然地推动内部NotImplementedException()
,因为您需要实现它。如果你忘记,解雇或其他什么,但不在其中写任何东西,那么在使用该方法时你的类消费者将获得该异常。
绝对正确的行为。