[英]Can I cast from an interface to a concrete type with another interface implementation
我應該首先說我非常喜歡接口,所以這可能是一個非常愚蠢的問題。 如果我的標題不清楚也要道歉 - 符合我的想法!
我確實理解接口背后的原理,我想在這里使用它們來支持單元測試,並通過DI Framework解耦,這是一個非常混亂和無法測試的遺留代碼。
我有一個名為IDatHandler的接口。 它有一個名為Items的List <>屬性。 具體實現應返回具體類型的IDatContainer。 當然有一些方法,但我把它們排除在外
public interface IDatHandler
{
....
List<IDatContainer> Items
{
get; set;
}
}
這是一個具體的實現:
public class ADEColorHandler : IDatHandler
{
....
public List<ADEColor> Items
{
get; set;
}
}
}
ADEColor實現了IDatContainer。 除非我替換的具體實施失敗ADEColor
與IDatContainer
。
有沒有辦法讓ADEColor
作為ADEColor
類型的列表返回,或者我只是違反規則?
我應該說這個應用程序目前正在使用NET 3.5
========= >>>答案 - 感謝Charleh!
IDatHandler接口
public interface IDatHandler<T> where T : IDatContainer
{
....
List<IDatContainer> Items
{
get; set;
}
}
具體課程:
public class ADEColorHandler : IDatHandler<ADEColor>
{
....
public List<ADEColor> Items
{
get; set;
}
}
}
我的單元測試ADEColorHandler斷言此列表並通過。
你可以走這條路:
public interface IDatHandler
{
// Any common interface stuff
}
public interface IDatHandler<T> : IDatHandler
where T : IDatContainer
{
// Any generics
List<T> Items;
}
public class ADEColorHandler : IDatHandler<ADEColor>
{
....
public List<ADEColor> Items
{
get; set;
}
}
這確實意味着你需要在另一端進行一些轉換,因為如果你只是傳遞IDatHandler
實例,你需要知道泛型類型才能查詢Items
你想要實現什么目標? 這可能有助於確定你可以使用什么......
或者,您可以在原始界面實現中使用IEnumerable - 您是否需要在設計時知道集合的具體類型,或者您可以通過投射來逃避?
編輯:添加上面的約束
只是試圖讓我的頭腦,因為使用上面的界面將在一定程度上工作,但我的假設是你想循環通過這些來處理它們等 - 我想知道這是否有用(需要檢查)
List<IDatHandler<IDatContainer>> someList = new List<IDatHandler<IDatContainer>>();
someList.Add((IDatHandler<IDatContainer>)new ADEColorHandler());
然后你可以枚舉列表......只是檢查一下是否有效。
編輯:nope,沒有工作,因為泛型類型在運行時實際上是不同的。 我會亂七八糟 - 我喜歡嘗試找出你能做什么,不能用泛型做什么!
編輯:
好的,最好的可能是:
public interface IDatHandler<T> : IDatHandler
where T : IDatContainer
{
List<T> Items { get; set; }
}
public class ADEColorHandler : IDatHandler<IDatContainer>
{
public List<IDatContainer> Items
{
get;
set;
}
}
這意味着你可以做到:
var items = new List<IDatHandler<IDatContainer>>();
items.Add(new ADEColorHandler());
然后,您可以枚舉並從每個IDatHandler
獲取Items
並查詢每個IDatContainer
。 當然,您從具體類型中隱藏,但我假設您在容器上有一個接口來嘗試抽象這些實現細節。 這應該沒問題
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.