2009-04-30 106 views
3

名單也許我是愚蠢的,但...接口與接口

我:

public interface IRequest 
{ 
    IList<IRequestDetail> Details { get; set; } 

    // stuff 
} 

public interface IRequestDetail 
{ 
    // stuff 
} 

我那麼有:

public class MyRequest : IRequest 
{ 
    IList<MyRequestDetail> Details {get; set; } 

    // stuff 
} 

public class MyRequestDetail : IRequestDetail 
{ 
    // stuff 
} 

它不工作。

C#因爲MyRequest由於沒有IRequestDetail的IList而沒有實現接口,所以很生氣。

現在,如果我改變它,所以詳細信息是IRequestDetail的IList,然後我必須將它強制轉換爲MyRequestDetail中的任何地方我使用非接口成員(我有幾個請求共享常見的東西,但然後專門化)。

我有點理解它爲什麼錯了,但並不完全!

+0

我認爲隨着鑄造,你正在刪除接口的規定。 – 2009-04-30 16:11:19

+0

Yah ...當寫「我有幾個共享常見問題的請求,但然後專門化」我有點意識到,也許我有界面瘋狂和忽略,這是更好的只是繼承?我不確定它是否會有相同的問題。 – anonymous 2009-04-30 16:30:03

+0

@huey,你會遇到同樣的問題,但編寫的代碼較少。 :)我嘗試做YAGNI(你不需要它),但接口是我的一個惡習。我做了太多它們以便我可以在單元測試中使用模擬框架 – 2009-04-30 16:32:53

回答

10

我認爲,基於問題是你想將Details作爲一個通用列表並強制它實現IRequestDetail。你也希望它對於實現類更具體的輸入。在這種情況下,你需要使IRequest成爲通用的。

試試這個:

public interface IRequest<T> where T : IRequestDetail 
{ 
    IList<T> Details { get; set; } 

    // stuff 
} 

public class MyRequest : IRequest<MyRequestDetail> 
{ 
    public IList<MyRequestDetail> Details {get; set; } 

    // stuff 
} 

這應該爲你工作。

編輯2017年3月17日

在回覆@羅伯特的評論,見下面擴展的代碼:

public interface IRequestDetail 
{ 

} 

public class MyRequestDetail : IRequestDetail 
{ 

} 

public interface IRequest<T> where T : IRequestDetail 
{ 
    IList<T> Details { get; set; } 

    // stuff 
} 

public class MyRequest<T> : IRequest<T> 
    where T : IRequestDetail 
{ 
    public IList<T> Details { get; set; } 

    // stuff 
} 

public class Consumer 
{ 
    public void MyFunction<T>(IRequest<T> request) 
     where T : IRequestDetail 
    { 

    } 

    public void Foo() 
    { 
     var test = new MyRequest<MyRequestDetail>(); 
     MyFunction(test); 
    } 
} 
2

精確。 Michael有解決方案。 這個問題有點棘手。

它的存在從

IList<MyRequestDetail> 

IList<IRequestDetail> 

沒有明確的轉換,因爲這將意味着,你可以添加其他的對象,是基於不同類別(如MyRequestDetail2),即不是「MyRequestDetail」到第二個對象。 ,那第一個就是非法的。

0

這是由於C#中的協變和逆變。在Eric Lippert's Blog上有一個非常詳細,非常清晰的問題解釋(分成許多部分)。