假设您有一个名为Food的类,并且您有衍生类,称为Banana,Apple和Orange。你有一个FoodProcessor方法,在大多数情况下,它可以处理任何类型的食物,但偶尔需要知道它正在处理什么类型的食物,以便做一些类型特定的事情,如剥香蕉,核心苹果,或挤压橙色。
所以你的FoodProcessor需要Food参数。 FoodProcessor检测Food实例的特定衍生类型的最佳方法是什么?
答案 0 :(得分:1)
你应该使用多态,每个Food
子类将定义一个方法process()
,而FoodProcessor
类将只调用该方法。
FoodProcessor
public void process(Food f) {
f.process();
}
苹果
public void process() {
Console.WriteLine("Core the apple.");
}
香蕉
public void process() {
Console.WriteLine("Peel the banana.");
}
橙
public void process() {
Console.WriteLine("Squeeze the orange.");
}
通过这种方式,您可以利用Food及其子类之间的继承关系。
答案 1 :(得分:1)
在测试对象类型时,我喜欢使用is
关键字,如下所示:
if(myFood is Bannana)
Peel((Bannana)myFood);
我更喜欢is
,因为它还会检查对象是否实现了接口。
说到接口,如果您有某些类型执行特定操作,您可能需要考虑使用接口。检查特定类型需要了解可能使用的不同类型,但是,如果检查接口,可能会出现实现此接口的新类型,而无需更改代码来处理它们:
if(myFood is IPeelable)
Peel((IPeelable)myFood)
else if(myFood is ICoreable)
Core((ICoreable)myFood)
如果你寻找特定的类型,你需要现在和将来知道每种可能的类型,这种类型的可扩展性不是很高。
这当然假设您不想使用直接多态,正如其他答案之一所描述的那样。
答案 2 :(得分:0)
void FoodProcessor(Food food)
{
if(food is Banana)
...
else if(food is Apple)
...
...
etc
}
编辑:如果你可以使用其他答案中提到的多态,那么忽略这个
答案 3 :(得分:0)
我会把它抽象化并在每种食物中实施:
abstract class Food {
public abstract void Prepare();
}
class Banana : Food {
public override void Prepare() {
Peel();
}
}
class Apple : Food {
public override void Prepare() {
Core();
}
}
然后你会:
class FoodProcessor {
public void Process(Food food) {
food.Prepare(); // preparation of the food
food.Process();
}
}