如果超类不包含代码,是否可以接受?

时间:2014-07-28 15:36:50

标签: oop software-design

我对编程和计算很新。我经常发现自己需要按照通用名称对许多类进行分组。例如,我可能需要编写一堆方法eat(Orange orange)eat(Apple apple)eat(Kumquat kumquat),对应于,你知道,吃橘子,苹果和金橘。但通常,简单地编写一个方法eat(Fruit fruit)要容易得多。因此,我创建了FruitOrangeApple所有扩展的类Kumquat,并且eat(Fruit fruit)在其方法体中使用构造实例区分这些类型。但Fruit实际上并不包含任何自己的方法或字段;它只是一个普遍的名字,水果都会过去。

这是一种可接受的软件设计模式吗?对于一个简单的问题,这是一个强有力的手臂方法,它不会感到很时髦。

如果没有,通常的替代方案是什么?

非常感谢

2 个答案:

答案 0 :(得分:2)

没有会员的类型有什么用?除非你将它转换为其中一个子类型(你不应该),否则很难以多态方式对待它。

public void Eat(Fruit fruit)
{
    //What do I do with the fruit now?
    //I can't call any method on it, or retrieve any data from it
}

  

eat(Fruit fruit)在方法体中使用构造实例

区分这些类型

这是一种代码味道。它打破了Open-Closed principleprinciple of least surprise,这是一种不好的做法。

想象一下,我决定从Fruit派生并添加一个名为Mango的类。如果我然后调用你的Eat方法,它将无效 - 因为它只适用于某些种水果,而不适用于任何水果。

答案 1 :(得分:2)

是的,这是可以接受的,这甚至是一种很好的做法。

您的超类目前可能没有代码,但是当您需要常见行为时,让超类减少重构工作。

此外,如果您使用泛型,您可以指定您的对象应该扩展Fruit,这会限制您可以调用该方法的对象数。

在java中: void< TFruit延伸水果>吃(TFruit水果);

代替: void< TFruit>吃(TFruit水果);

可以在任何对象上调用第二个方法(例如StringBuilder),你显然不能吃字符串构建器。

编辑: 但是,您的对象设计很奇怪。水果不应该吃。一个人或动物吃水果。吃的方法可能不属于水果。此外,如前所述,有一种方法可以使用多个ifs来查明行为,这是一种不好的做法。