这就是我要做的事情:
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语句中初始化变量然后复制其他东西/把它放在一个函数中并调用它两次?
答案 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;
您可以按照自己的方式添加列表,也可以添加Cat
和Dog
等其他动物
allAnimals.Add(myDog);