需要初始化的接口实现

时间:2012-07-26 13:46:58

标签: c# interface constructor initialization

我想提取一个需要启动的类的接口。

public class Example<T>
{
    public Example(SomeData data)
    {
        // initialize self with data
    }

    public IEnumerable<T> GetObjects(SomeData data)
    {
        // extract data
    }
}

问题是我们无法编写一个强制执行非默认类型构造函数的接口。我当然可以将班级改为:

public interface IExample<T>
{
    void Initilize(SomeData data);
    IEnumerable<T> GetObjects(SomeData data);
}

public class Example<T> : IExample<T>
{
    public void Initilize(SomeData data)
    {
        // initialize self with data
    }

    public IEnumerable<T> GetObjects(SomeData data)
    {
        // extract data
    }
}

但这不一样,因为当一个人实例化时,这个类型可以直接调用GetObjects,这会导致实例未被启动的异常。

我还有其他选择吗?

2 个答案:

答案 0 :(得分:3)

因为这只是一个接口,所以你不应该关心构造函数。接口定义了实现可以执行的操作,但没有具体说明它们是如何执行的,或者是调用了哪些订单方法。

你怎么能够现实地说,将来不会有一些不同的接口实现并且不需要构造函数?

答案 1 :(得分:1)

你没有。构造函数参数是类的实现细节 - 它们与接口无关,除非您决定使GetObjects成为读/写属性。

你正在构建一个具体的实例,你已经知道了那里的类本身,所以你知道你需要传递某些构造函数参数。

如果您真的想要在外部强制执行“所有IExamples必须使用某些参数构建”的想法,请使用工厂模式:

public static class ExampleFactory {
    public static IExample<T> MakeAnExample(SomeData data) {
        // return some concrete implementation... 
    }
}