我需要添加不同类型的对象(即使它们不同,它们共享相同的基类,它们是兄弟姐妹。
考虑这个类层次结构
public abstract class Fruit
{
public int Quality { get; set; }
public string Name { get; set; }
}
public sealed class Apple :Fruit
{
public string Color { get; set; }
public Apple(string color ="Red")
{
Color = color;
}
}
public sealed class Orange : Fruit
{
public Orange(string type = "WithSeed")
{
Type = type;
}
public string Type { get; set; }
}
我该怎么做呢
_apples = new List<Apple>
{
new Apple
{
Name = "Fiji Apple",
Quality = 9,
Color ="Green"
},
new **Orange**
{
Name = "Indi Orange",
Quality = 7,
}
};
此通用列表的使用者将使用基类使用它。例如:使用IEnumerable<Fruit>
。
有人可以建议吗?
答案 0 :(得分:2)
列出Fruit
。这样,列表将包含任何Fruit
对象以及从Fruit
继承的任何类型的对象。
List<Fruit> _list = new List<Fruit>
{
new Apple
{
Name = "Fiji Apple",
Quality = 9,
Color ="Green"
},
new Orange
{
Name = "Indi Orange",
Quality = 7
}
};
答案 1 :(得分:1)
列表必须始终知道它包含哪种类型。因此,为了使其包含Apple
和Orange
,您必须将列表定义为包含任何超级类或接口,以涵盖您希望放入列表中的所有项目。
在这种情况下,这会使List<Fruit>
或List<object>
包含两者。
答案 2 :(得分:0)
为此目的使用类层次结构是一个常见的错误。 有一个接口并为该接口创建一个List,然后你甚至可以存储不属于该类层次结构的对象。
当您需要存储不同类型的对象时,只需实现该类型的接口,这样您就不必对存储列表代码进行任何更改。
答案 3 :(得分:0)
因为从Fruit继承的所有对象足以创建List
的{{1}}
Fruit
如果我有一个类 List<Fruit>_apples = new List<Fruit>{...}
必须创建一个not extend Fruit
作为所有类型(值类型和引用预定义和用户定义)都是直接或间接从{{继承的1}} 强>
List of objects
请注意,如果您不延伸,Fruit无法访问其属性,例如Object
和List<Object>_apples = new List<Object>{...}
答案 4 :(得分:0)
使用此代码在列表中添加不同的对象
List<Fruit> fruits = new List<Fruit>();
fruits.Add(new Apple("Red"));
fruits.Add(new Orange("Withseed"));
答案 5 :(得分:0)
我相信您尝试做的是使用不同类型Fruit
的列表来存储它们或将它们传递到一个List
,而不是需要单独List<Apple>
List<Orange>
1}},Apple.Color
等。但您仍需要使用特定类型的内容(例如Orange.Type
和FruitBasket
)。
为了证明这一点,我创建了一个Fruit
类,用于存储所有不同的Project()
个对象,并public class FruitBasket
{
public List<Fruit> FruitList { get; }
public FruitBasket(List<Fruit> fruitList)
{
FruitList = fruitList;
}
public List<string> Project()
{
var result = new List<string>();
foreach (var fruit in FruitList)
{
if (fruit is Apple)
{
var apple = (Apple) fruit;
result.Add("This is a " + apple.Color + " " + apple.Name);
}
else if (fruit is Orange)
{
var orange = (Orange) fruit;
result.Add("A " + orange.Name + " with type: " + orange.Type);
}
else
{
result.Add("An unknown " + fruit.Name);
}
}
return result;
}
}
个对象及其独特的属性。
Fruit
在循环遍历所有不同的var result = new FruitBasket(new List<Fruit>
{
new Apple
{
Name = "Fiji Apple",
Quality = 9,
Color = "Green"
},
new Orange
{
Name = "Indi Orange",
Quality = 7,
}
}).Project();
对象时,它会检查水果的类型并将唯一的字符串放在列表中。
这个例子的用法是:
result
而ICE30: The target file 'eiycriw9.exe|MyApp.exe' is installed in '[ProgramFilesFolder]\Folder\MyAppFolder' by two different components on an LFN system: MyApp.exe and cmp497A0C7040B1E426AA3569D995A62AF2. This breaks component reference counting.
将是:
这是绿色斐济苹果
Indi Orange类型:WithSeed