【发布时间】:2021-03-12 17:40:22
【问题描述】:
这里的整个系统是一种图书馆。我有一个名为 Person 的超类,它有两个构造函数:一个将名字和姓氏作为单独的字符串,另一个将这些参数以及中间名的 ArrayList 用作中间名 - 这个想法是有些人没有中间名.在一个名为Member 的子类中,我希望通过传递一个空的ArrayList 来选择创建一个有或没有中间名的成员对象。我的第一个想法是这样的:
if (middleNames.size() == 0) {
super(firstName, lastName);
} else {
super(firstName, middleNames, lastName);
}
但我现在意识到super() 构造函数必须是子类构造函数中的第一个语句。希望您能看到我在这里尝试做的事情 - 有没有在 Member 类中编写两个构造函数的好方法?有几行代码我不想重复。
【问题讨论】:
-
无论哪几行代码不想重复,都可以放在Person类的方法中吗?
-
我看不出这样做的真正原因。你的超类构造函数做不同的事情吗?我的意思是,如果
Person将只有一个构造函数来检查middleNames参数是否为空,然后自己做某些事情,这样任何子类都不会费心做同样的事情?跨度> -
@PaulSamsotha 这对构造函数来说可以接受吗?澄清一下 - 代码行构成了构造函数的其余部分。
-
另外,
Person构造函数可能会更好地接受Collection而不是ArrayList(出于设计原因),并使用isEmpty()而不是size() == 0进行检查(出于性能原因)。 -
@fluffy - 因为(中间)名称的顺序很重要,不仅仅是任何
Collection都会这样做,它必须是定义/维护顺序的名称;List将是通常的选择。此外,Donagh,根据 NomadMaker 的评论,请参阅“程序员相信名称的虚假”shinesolutions.com/2018/01/08/…
标签: java inheritance constructor subclass superclass