0

这就是我想要做的:

abstract class BaseAnimal;
class cat : BaseAnimal;
class dog : BaseAnimal;


var allAnimals = new list<BaseAnimal>();

foreach (var someVar in allVars)
{
    var myAnimal = new BaseAnimal();

    if (someVar == true)
    {
        myAnimal = new cat();
    }
    else
    {
        myAnimal = new dog();
    }


    /* do other things with myAnimal var */
    allAnimals.add(myAnimal);
}

有没有办法做这样的事情,还是我必须在每个 IF 语句中初始化变量,然后复制其他东西/把它放在一个函数中并调用它两次?

4

3 回答 3

6

只需声明变量而不给它赋值:

BaseAnimal myAnimal;

为什么要给分配一个值,知道该值无论如何都会被立即覆盖?

请注意,在您的情况下,无论如何,变量肯定会在语句之后分配if/else,所以这不是问题 - 在将项目添加到列表时,您仍然可以读取变量值。

当然,您也可以考虑使用条件运算符:

var myAnimal = someVar ? (BaseAnimal) new Cat() : new Dog();

由于条件运算符的工作方式,这里BaseAnimal只需要转换为 - 表达式的整体类型必须第二个参数的类型第三个参数的类型。

编辑:如果您需要设置特定于动物的属性,最简单的方法是在if语句中使用对象初始化器:

if (someVar)
{
    myAnimal = new Cat { Lives = 9 };
}
else
{
    myAnimal = new Dog { Shaggy = true };
}

如果你需要调用它的方法,你需要一个单独的特定类型的局部变量:

if (someVar)
{
    Cat cat = new Cat();
    cat.Groom();
    myAnimal = cat;
}
于 2013-04-04T14:34:49.813 回答
3

在这种情况下,您不会对其进行初始化(或者您会将其初始化为 null),但是是的,您的要求是可能的。

BaseAnimal myAnimal;

if (someVar) {
    var myCat = new cat();

    // Do things with myCat that are cat-specific.

    myAnimal = myCat;
} else {
    var myDog = new dog();

    // Do things with myDog that are dog-specific.

    myAnimal = myDog;
}

allAnimals.add(myAnimal);
于 2013-04-04T14:34:57.467 回答
0

你不能

 var myAnimal = new BaseAnimal();

编译器不会让你这样做。但是,您可以将派生程度更高的类转换为派生程度较低的类,例如

BaseAnimal ba = myDog;

您可以按照自己的方式拥有列表,并且可以添加其他动物,例如Cats 和Dogs like

allAnimals.Add(myDog);
于 2013-04-04T14:36:29.523 回答