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";
}

c#将基类转换为派生类,反之亦然

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类继承类。类CatDog。我需要处理这个List。要做到这一点,我必须做一些像

Foreach(Animal A in AnimalList)
{
if(CheckingThatItIsCat(A)) 
 {
 Cat C = A;
 }
}

我真的知道A是真正的Cat类,但这行代码调用语法错误