簡體   English   中英

我可以使用另一個接口實現從接口轉換為具體類型

[英]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。 除非我替換的具體實施失敗ADEColorIDatContainer

有沒有辦法讓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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM