2011-04-20 82 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的方式。

相關問題