2014-10-11 50 views
4

在Java中编写程序时,如果我有一个特殊情况的对象需要通过主类区别对待,但不需要任何其他方法,是否更好将一个布尔参数添加到对象的构造函数(如isSpecial)中,并检查该对象在主类中是特殊的还是创建一个扩展原始对象的新对象?扩展类与添加布尔参数

例如:

我有一个Cat类。如果一只猫有胡须,我想打印“这只猫有胡须!”在Main类中。

有一个WhiskerCat类或简单地添加一个布尔参数给Cat构造函数如hasWhiskers会更好吗?

回答

1

只需添加布尔参数。你不想结束大量类似的事情。例如,在Cat类中,hasWhiskers的默认值应该为false,如果它们不调用明确要求它们指定它的构造函数,则保持false。然后你可以有一个hasWhiskers()方法返回这个布尔属性。

通常,只有在新类具有附加功能(附加方法等)时才能扩展类,而这些附加功能不能简单地添加到原始类中。

+0

只是想知道:比方说,你有猫类相关的4个布尔值。你会为所有可能的参数组合使用16种不同的构造函数吗?我的猜测是你只会写出那些经常使用的。 – okarin 2014-10-11 04:40:22

+1

你可以选择写16层不同的构造函数(假设它是好的,为你的类可以拥有任意数量由用户设置的布尔值,并没有由用户设定的任何号码),但通常你只会写的组合构造函数只会经常使用。或者,对于这个问题,您可以有一个构造函数,它要求用户指定所有内容,并且用户可以为所有布尔参数写入'false'。 – ElvenAshwin 2014-10-11 04:53:44

1

这是一个责任问题:哪个班级在做什么? 你的“主”类不应该意识到“猫”类的内部。

在你的情况下,这意味着可能需要调整Cat类的实现,以使主类可以使用新接口来打印该消息。

然后,Cat类本身可以有布尔,构成猫的(列表)组件,或者你可以继承的方式。这很可能取决于真正的问题:还有更多的变化吗?这真的是唯一的区别吗?你正在上课/考试吗? (在最后一种情况下,应用你所教的方式可能更有用)。

1

我觉得问题是关于设计模式而不是编码风格

一般来说,如果你想在一个类中添加一些新的功能。

首先,你应该问自己它是一个接口还是属性?如果它是一个属性,那么有两种方法来解决它。

方法1:你所提及般

方式二:你应该使用委托(即添加hairclass考虑是否是一个长头发的猫 或者是短头发的猫。)

1

只是想知道,是添加一个布尔值唯一的方法来识别对象是否特殊?肯定还有一些其他的特性使它变得特别吗?

无论如何,知道它是不是主要职责的责任。留下应该打印到Cat类而不是Main类的内容。

1

在我看来,这取决于特性的特殊性。

如果我们考虑另一个例子:

汽车...
属性“天窗”或“导航”是相当普遍,有车无特殊要求,可以是基础类的一部分。 但是,警笛和闪光灯是非常罕见的,如果它们是另一个扩展类的属性,它会更适合。