gpt4 book ai didi

c# - .NET - 集合和继承

转载 作者:太空狗 更新时间:2023-10-30 00:56:08 24 4
gpt4 key购买 nike

我有三个具有共同父类的类。假设 parent 是动物, child 是狗、猫和鹦鹉。

我有一个可观察的集合,其中包含用户正在使用的动物集合。集合包含所有相同类型的动物 - 用户要么只处理所有狗或所有猫或所有鹦鹉。

所以我声明了ObservableCollection<Animal> animals 并根据用户选择我想将属性 animals 的内容更改为 ObservableCollection<Dog>ObservableCollection<Cat>ObservableCollection<PArrot> .因此,用户当前与狗或猫一起工作并不重要,但他可以选择动物的所有共同行为。

但它不起作用。看来我不能分配 ObservableCollection<Cat>ObservableCollection<animal> 类型的属性.我认为它应该可行,因为 animal 是 cat 的父类(super class)型,所以我可以像往常一样将 cat 分配给 animal 变量。

为什么我不能这样做,我该如何解决这个问题?

最佳答案

它不起作用的一个原因是:如果它确实起作用,您可能会遇到无意义的场景:

ObservableCollection<Animal> animals = new ObservableCollection<Dog>();
animals.Add(new Cat()); // cat is an animal, after all

另一个原因是,ObservableCollection<Dog> 根本不是这样的。 继承 ObservableCollection<Animal> - 它们只是 ObservableCollection<> 的不同(并行)封闭通用类型.

允许的是某些具有“仅输出”API 的接口(interface)(例如 IEnumerable<T>)可以是协变,因此如果您只需要迭代它们,你可以:

IEnumerable<Animal> animals = new ObservableCollection<Dog>();

(大概在其他地方添加狗)

另一种方法是使用非通用 API:

IList animals = new ObservableCollection<Dog>();

关于c# - .NET - 集合和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8467546/

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