不使用接口来掌握API

时间:2012-02-01 13:54:52

标签: c# interface notimplementedexception

我刚刚获得了一个似乎比我习惯的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以使用该方法实例化对象?还是我完全走错了路?

2 个答案:

答案 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(),因为您需要实现它。如果你忘记,解雇或其他什么,但不在其中写任何东西,那么在使用该方法时你的类消费者将获得该异常。

绝对正确的行为。