Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不掌握使用接口的API_C#_Interface_Notimplementedexception - Fatal编程技术网

C# 不掌握使用接口的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

我刚刚收到一个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();
    }
这是一个基本结构。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。没有什么比从代码本身自动生成的文档更重要的了(这是这个特定公司的标准),所以我不得不把它分开。谢谢你在界面方面的帮助!非常感谢。