你可以初始化一个抽象类,以便以后可以将它设置为等于子类吗?

use*_*427 0 c# abstract-class

这就是我想要做的:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 6

只需声明变量而不为其赋值:

BaseAnimal myAnimal;
Run Code Online (Sandbox Code Playgroud)

为什么为它分配一个值,知道该值会立即被覆盖?

请注意,在您的情况下,无论如何都会在语句之后明确赋值变量if/else,因此这不是问题 - 在将项添加到列表时,您仍然可以读取变量值.

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

var myAnimal = someVar ? (BaseAnimal) new Cat() : new Dog();
Run Code Online (Sandbox Code Playgroud)

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

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

if (someVar)
{
    myAnimal = new Cat { Lives = 9 };
}
else
{
    myAnimal = new Dog { Shaggy = true };
}
Run Code Online (Sandbox Code Playgroud)

如果需要在其上调用方法,则需要一个特定类型的单独局部变量:

if (someVar)
{
    Cat cat = new Cat();
    cat.Groom();
    myAnimal = cat;
}
Run Code Online (Sandbox Code Playgroud)