1

我想提取需要初始化的类的接口。

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它,然后会导致实例未初始化的异常。

我还有什么其他选择?

4

2 回答 2

3

由于这只是一个接口,你不应该关心构造函数。接口定义了实现可以做什么,但没有具体定义它们如何做或调用什么顺序方法。

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

于 2012-07-26T13:53:29.797 回答
1

你没有。构造函数参数是类的实现细节——除非您决定创建GetObjects读/写属性,否则它们与接口无关。

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

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

public static class ExampleFactory {
    public static IExample<T> MakeAnExample(SomeData data) {
        // return some concrete implementation... 
    }
}
于 2012-07-26T13:52:13.940 回答