2011-04-20 67 views
1

比方说,我从IMyManager继承SetModel。如果我实现它,我通常会写:通过子类型参数从类接口继承方法:是否有可能?

using lib.model; 

namespace MyComponents 
{ 
    public class MyManager:IMyManager 
    { 

     public void SetModel(ILibModel model) 
     { 

     } 

    } 
} 

这对编译器来说很好。

现在让我们来说,不是ILibModel,而是传递实现ILibModel的具体类MyModel。

为什么编译器不接受此而为MyModel的类型ILibModel的:

namespace MyComponents 
{ 
    public class MyManager:IMyManager 
    { 

     public void SetModel(MyModel model) { 

     } 
    } 
} 

回答

2

假设MyModel工具ILibModel这不工作的原因是因为虽然所有MyModel类型ILibModel类型,逆不成立。也就是说并非所有ILibModel类型都是MyModel类型。

该接口明确指出它必须采用ILibModel类型。所以一个只需要MyModel的实现不符合你的接口合约,因为一个类型,例如MyOtherModel也实现了ILibModel是一个基于你的接口契约传入的有效类型。

解决此问题的唯一方法是在接口上使用泛型。一个例子是:

public interface IMyManager<TModel> 
    where T : ILibModel 
{ 
    void SetModel(TModel model); 
} 

public class MyManager : IMyManager<MyModel> 
{ 
    void SetModel(MyModel model) 
    { 

    } 
} 

然而,你可能遇到与这种系统的协方差和反方差的问题。

+0

反过来并不成立,但我不是相反的情况。问题是,而不是这个愚蠢的接口只是不会自动执行,而应该。 – user310291 2011-04-21 07:07:03

+0

感谢泛型会看看它是否适合。 – user310291 2011-04-21 07:08:18

1

由于您提供的则setModel函数的重载。就编译器而言,也许你想允许程序员对具体类型做更具体的事情,而使用接口版本做其他事情。

1

,因为有人可能后来写:

((IMyManager)myManager).SetModel(new OtherClassThatImplementsILibModel()); 
0

因为IMyManager定义SetModel的方式。

相关问题