C#标记衍生类实例的最佳方法

时间:2013-02-13 21:53:45

标签: c# inheritance

假设您有一个名为Food的类,并且您有衍生类,称为Banana,Apple和Orange。你有一个FoodProcessor方法,在大多数情况下,它可以处理任何类型的食物,但偶尔需要知道它正在处理什么类型的食物,以便做一些类型特定的事情,如剥香蕉,核心苹果,或挤压橙色。

所以你的FoodProcessor需要Food参数。 FoodProcessor检测Food实例的特定衍生类型的最佳方法是什么?

4 个答案:

答案 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();
    }
}