2013-11-01 131 views
1

第一个例子工程,混凝土式/通用接口

public interface IFoo 
{ 
    int DoThing(int request); 
} 

public class Foo : IFoo 
{ 
    public int DoThing(int a) 
    { 
     return 1; 
    } 
} 

public class FooFactory<TResult, TRequest> 
{ 
    public IFoo Create() 
    { 
     return new Foo(); 
    } 
} 

但这第二泛型实例不起作用

public interface IFoo<TResult, TRequest> 
{ 
    TResult DoThing(TRequest request); 
} 

public class Foo : IFoo<int, int> 
{ 
    public int DoThing(int a) 
    { 
     return 1; 
    } 
} 

public class FooFactory<TResult, TRequest> 
{ 
    public IFoo<TResult, TRequest> Create() 
    { 
     return new Foo(); 
    } 
} 

给人错误:

Cannot implicitly convert type Foo to IFoo<TResult, TRequest> 

在第一个例子,Foo具有IFoo的行为,所以一切都很好,但是Foo并没有在第二个例子中展示泛型IFoo的行为。

+0

如果这个工作,想象下面的代码:'VAR一个=新FooFactory <字符串,字符串>(); var b = a.Create();'因为'a'是'FooFactory ','b'的类型是'Create'的返回类型,它是'IFoo ',但该函数实际上会返回'IFoo '。你可以做的就是返回(IFoo )新的Foo();',然后它会编译并抛出一个运行时无效的转换异常,如果你在我的例子中使用不当的话。通常,你不想这样做,因为你想在编译时捕获类型不匹配。 – svinja

+0

这是用于C#的吗?请将语言标记添加到您的问题 – Bohemian

+0

这是针对C#的,我该如何着手创建返回类型未知的FooFactory?所以创建可能会返回一个IFoo 或一个IFoo - 这就是为什么返回类型是IFoo user1054637

回答

1

在第二个示例中,您返回的new Foo()类型为IFoo<int,int>,但方法声明表示应该返回IFoo<TResult,TRequest>

所以,如果你不是做这样的:

public class FooFactory 
{ 
    public IFoo<int, int> Create() 
    { 
     return new Foo(); 
    } 
} 
+0

好吧,我该如何去创建一个返回类型不知道的FooFactory?所以创建可能会返回一个IFoo 或一个IFoo <字符串,字符串> - 这就是为什么返回类型是IFoo user1054637

+0

这实际上不是泛型的意图,那就是您使用继承的原因。但是你可以引入一个实际创建的间接层。但是从你所描述的,我会说你看看AbstractFactory模式:http://www.dofactory.com/Patterns/PatternAbstract.aspx。 – giZm0