【发布时间】:2015-11-10 09:38:55
【问题描述】:
信息: 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;
}
所以在上面,我只想访问动物的公共部分,我希望 IAnimalShelter 有一个 Animals 属性,但是对于派生的庇护所类型有更强类型的 Animals 列表。
【问题讨论】:
-
我不明白 ICatShelter 和 IDogShelter 中需要
List<Cat>和List<Dog>。就在您初始化Animals列表时,只需将其设为new List<Cat>或new List<Dog> -
我的理由是代码中还有很多其他地方知道他们正在处理 Cats,例如,因此希望能够访问 Cat.Whiskers 而无需将动物强制转换为 List .
-
我最终还是选择了这个,因为事实证明,我需要访问界面之外的一两个特殊属性的时间很少。