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

时间:2013-04-04 14:33:01

标签: 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);
}

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

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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);

答案 2 :(得分:0)

你不能

 var myAnimal = new BaseAnimal();

编译器不允许你这样做。但是,您可以做的是将更多派生类转换为派生类较少的类,例如

BaseAnimal ba = myDog;

您可以按照自己的方式添加列表,也可以添加CatDog等其他动物

allAnimals.Add(myDog);