我对编程和计算很新。我经常发现自己需要按照通用名称对许多类进行分组。例如,我可能需要编写一堆方法eat(Orange orange)
,eat(Apple apple)
,eat(Kumquat kumquat)
,对应于,你知道,吃橘子,苹果和金橘。但通常,简单地编写一个方法eat(Fruit fruit)
要容易得多。因此,我创建了Fruit
,Orange
和Apple
所有扩展的类Kumquat
,并且eat(Fruit fruit)
在其方法体中使用构造实例区分这些类型。但Fruit
实际上并不包含任何自己的方法或字段;它只是一个普遍的名字,水果都会过去。
这是一种可接受的软件设计模式吗?对于一个简单的问题,这是一个强有力的手臂方法,它不会感到很时髦。
如果没有,通常的替代方案是什么?
非常感谢
答案 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 principle和principle of least surprise,这是一种不好的做法。
想象一下,我决定从Fruit
派生并添加一个名为Mango
的类。如果我然后调用你的Eat
方法,它将无效 - 因为它只适用于某些种水果,而不适用于任何水果。
答案 1 :(得分:2)
是的,这是可以接受的,这甚至是一种很好的做法。
您的超类目前可能没有代码,但是当您需要常见行为时,让超类减少重构工作。
此外,如果您使用泛型,您可以指定您的对象应该扩展Fruit,这会限制您可以调用该方法的对象数。
在java中: void< TFruit延伸水果>吃(TFruit水果);
代替: void< TFruit>吃(TFruit水果);
可以在任何对象上调用第二个方法(例如StringBuilder),你显然不能吃字符串构建器。
编辑: 但是,您的对象设计很奇怪。水果不应该吃。一个人或动物吃水果。吃的方法可能不属于水果。此外,如前所述,有一种方法可以使用多个ifs来查明行为,这是一种不好的做法。