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 以使用该方法实例化对象?还是我完全走错了路?

4

2 回答 2

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 服务的新实现。

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

于 2012-02-01T13:57:32.157 回答
1

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

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

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

绝对正确的行为。

于 2012-02-01T14:10:21.203 回答