簡體   English   中英

如何轉換實現接口的具體類列表

[英]How to cast a list of concrete classes which implement an interface

我有一個接口IAnimal和兩個類(Dog,Cat),它們都實現了該接口。

public interface IAnimal
{
    int Age { get; set; }
}

public class Dog : IAnimal
{
    public int Age { get; set; }
}

public class Cat : IAnimal
{
    public int Age { get; set; }
}

另外,我有一個AnimalsManager類,如下面的代碼所示。

public class AnimalsManager
{
    private readonly List<Dog> _dogs = new List<Dog>();
    private readonly List<Cat> _cats = new List<Cat>();

    public void SetTargetAnimalsAge(bool isDog, int age)
    {
        if (isDog)
        {
            setAnimalsAge(_dogs, age);
        }
        else
        {
            setAnimalsAge(_cats, age);
        }
    }

    private static void setAnimalsAge<T>(IEnumerable<T> animals, int age) where T : class, IAnimal
    {
        foreach (var animal in animals)
        {
            animal.Age = age;
        }
    }
}

在方法SetTargetAnimalsAge中,根據isDog參數的值,兩次使用setAnimalsAge。 我想將這兩種用法合並為1,但以下代碼無法編譯。

// Do not compile.
// var animals = isDog ? _dogs : _cats;
// var animals = isDog ? _dogs as List<IAnimal> : _cats as List<IAnimal>;

setAnimalsAge(animals, age);

如何將“貓狗”列表中的一個作為IAnimal列表處理?

請不要分別列出2張清單,一張代表狗,一張代表貓。 AnimalsManager應該只了解IAnimal 堅持接口,因此依賴倒置

public class AnimalsManager
    {
        private readonly List<IAnimal> _animals = new List<IAnimal>();

        public void SetTargetAnimalsAge(int age)
        {
            setAnimalsAge(_animals, age);
        }

        private static void setAnimalsAge<T>(IEnumerable<T> animals, int age) where T : class, IAnimal
        {
            foreach (var animal in animals)
            {
                animal.Age = age;
            }
        }
    }

您不能將其作為IList<T>因為IList<T>不是協變的,而IEnumerable<T>是協變的。 您可以將其IEnumerable<T>IEnumerable<T> ,這應該可以工作。

例如,以下代碼應該工作:

public void SetTargetAnimalsAge(bool isDog, int age)
{   
     var animals = isDog ? (IEnumerable<IAnimal>)_dogs : _cats;
     setAnimalsAge(animals, age);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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