gpt4 book ai didi

c# - 在派生对象中使用比父对象定义的类型更强的列表

转载 作者:太空宇宙 更新时间:2023-11-03 13:01:52 25 4
gpt4 key购买 nike

信息:IDogShelter 和 ICatShelter 都继承自 IAnimalShelter。

接下来,我有实现和扩展 IAnimal 的 Cat 和 Dog 类。

IAnimalShelter has a List<IAnimal> called Animals.
ICatShelter has a List<Cat> called Animals.
IDogShelter has a List<Dog> called Animals.

问题:ICatShelter 不能有一个名为 Animals 的列表,因为 IAnimalShelter 已将其定义为 IAnimal 列表。 VS 说要使用“new”关键字。所以我只是把它拿走,IAnimalShelter 上没有 IAnimal 列表。

所以 - 我有一个名为 GetAnimalShelters() 的方法,它返回 IAnimalShelter 列表。然后我希望能够遍历避难所中的每个 IAnimal,但不能这样做,因为 IAnimalShelter 没有 IAnimal 列表。这使我不得不将我的结果转换为 ICatShelter 或 IDogShelter 以便迭代,但我希望能够成功地将 IAnimal 列表添加到 IAnimalShelter。我该怎么做?

例如:

public interface IAnimalShelter
{
List<IAnimal> Animals { get; set; }
}

public interface ICatShelter
{
List<Cat> Animals { get; set; }
}

public interface IDogShelter
{
List<Dog> Animals { get; set; }
}

然后:

List<IAnimalShelter> shelters = GetShelters(search);  //Works
foreach (IAnimalShelter shelter in shelters)
{
var x = shelter.Animals;
}

所以在上面,我只想访问动物的公共(public)部分,我希望 IAnimalShelter 具有 Animals 属性,但对于派生的庇护所类型具有更强类型的 Animals 列表。

最佳答案

您的类型 IAnimalShelter promise 其 Animals property 将产生一个对象,其 Add方法将接受类型为 Animal 的参数.如果ICatShelter源自 IAnimalShelter , 它也必须有一个 Animals产生一个对象的属性 Add方法将接受类型为 Animal 的参数.

要让这个模型工作,你应该定义IShelter<out T> where T:Animal其中包括 Animals类型属性 IReadOnlyList<T> , 和一个 TryDonate(Animal it)要求收容所接收特定动物的方法。 CatShelter : IShelter<Cat>将能够让客户端代码接收一个可读的对象列表,这些对象保证都是 Cat 类型,并且客户可能会尝试向其提交任何种类的动物,尽管捐赠的类型不是Cat。不会被添加到列表中。

关于c# - 在派生对象中使用比父对象定义的类型更强的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32055672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com