c#将基类转换为派生类,反之亦然
本文关键字:反之亦然 派生 基类 转换 | 更新日期: 2023-09-27 18:08:01
"可能已经有答案的问题"(这个话题似乎已经讨论过了,但我问的是一个稍微不同的问题)
我有三个类。Main()
方法只调用new Processor()
我在foreach()
有麻烦-这不能正常工作。我也认为Animals[X,Y] = new Cat();
,但我没有测试它-编译器叫我坏家伙;
public class Processor
{
Animal[,] Animals;
public Processor()
{
Animals = new Animal[10,10];
Random rand = new Random();
for(int X = 0; X < 10; X++)
for(int Y = 0; Y < 10; Y++)
{
if(rand.Next(4) == 1)
Animals[X,Y] = new Cat();
else Animals[X,Y] = new Dog();
}
foreach(Animal animal in Animals)
{
if(animal.IsCat)
{
Cat MyCat = animal;
DoSome(MyCat);
}
}
}
public void DoSome(Cat cat)
{
Never mind.
}
}
public class Animal
{
bool IsCat = false;
public Animal(){}
}
public class Cat : Animal
{
public Cat()
{
IsCat = true;
}
string MyColor = "White";
}
public class Dog : Animal
{
public Dog(){}
string MyOwner = "Dave";
}
Animals
是一个二维数组。它是数组的数组。数组的数组不像System.Array
类型那样实现IEnumerable
接口。因此,您不能使用foreach
循环遍历它的项。
在MSDN
中有更正式的表述foreach语句为每个语句重复一组嵌入语句数组中的元素或中实现的对象集合 System.Collections。IEnumerable 或 System.Collections.Generic。IEnumerable 界面。foreach语句用于遍历集合以获取需要的信息,但不能用于添加或删除项从源收集,以避免不可预测的副作用。如果你需要从源集合中添加或删除项,请使用for循环。
除了尝试使用foreach
循环遍历数组的问题外,还需要通过显式强制转换或使用as
操作符显式地将animal
转换为Cat:
if (animal.IsCat)
{
Cat cat = (Cat)animal;
// alteratively: Cat cat = animal as Cat;
DoSomethingFeline(cat);
}
有关详细信息,请参见MSDN。
我有List<Animal>
,必须随机填充从Animal
类继承类。类Cat
和Dog
。我需要处理这个List
。要做到这一点,我必须做一些像
Foreach(Animal A in AnimalList)
{
if(CheckingThatItIsCat(A))
{
Cat C = A;
}
}
我真的知道A
是真正的Cat
类,但这行代码调用语法错误