我想提取一个需要启动的类的接口。
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
,这会导致实例未被启动的异常。
答案 0 :(得分:3)
因为这只是一个接口,所以你不应该关心构造函数。接口定义了实现可以执行的操作,但没有具体说明它们是如何执行的,或者是调用了哪些订单方法。
你怎么能够现实地说,将来不会有一些不同的接口实现并且不需要构造函数?
答案 1 :(得分:1)
你没有。构造函数参数是类的实现细节 - 它们与接口无关,除非您决定使GetObjects
成为读/写属性。
你正在构建一个具体的实例,你已经知道了那里的类本身,所以你知道你需要传递某些构造函数参数。
如果您真的想要在外部强制执行“所有IExamples必须使用某些参数构建”的想法,请使用工厂模式:
public static class ExampleFactory {
public static IExample<T> MakeAnExample(SomeData data) {
// return some concrete implementation...
}
}