gat*_*cea 7 java oop inheritance
我有一个接口Person,我有2个类,Female并Male实现了接口.
对于女班,我有一个getPregnancyMonth我的男班没有的方法.将该方法添加到我的界面Person成为一个问题,因为我的Male类现在需要从接口继承该方法; 但男性永远不会怀孕.
什么是解决方案,我需要extend人而不是implement吗?
编辑:对不起,如果我的问题不明确.在这种情况下我已经添加两者get/ set从方法Male和Female类的接口.
static void Main(Form form) {
Person person = Factory.createPerson(form.getGender());
person.setName(form.getName());
if ("F".equals(gender)) {
person.setPregnancyMonth(form.getPregnancyMonth());
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,因为我的界面已经getPregnancyMonth,我的男性必须将该方法添加到具体类来实现接口.有办法避免这种情况吗?
getPregnancyMonth不应该在界面中Person.
个人......没有任何双关语...我认为你应该创建Person一个抽象类,因为女性和男性将分享许多相同的属性和功能.
然后,您可以创建反映每个性别的独特功能的女性和男性界面.
不要添加getPregnancyMonth到Person. 正如您所发现的,这没有多大意义。
在面向对象编程中,基类/接口(理想情况下)应该只包含其每个子类所共有的细节 - 因为这对于getPregnancyMonth两个子类来说并不常见(它对于 a 没有任何意义Male),所以它不应该位于Person界面中。我再次强调——这是在谈论理想。
正如其他答案所建议的,如果可以的话,尽量完全避免这个问题。例如,您可以使用instanceof来检测给定是否Person是 aMale或Female,并且仅getPregnancyMonth当Person是 a时才调用Female。
编辑,回应评论:使用所描述的工厂方法在很大程度上是毫无意义的。如果我们忽略那些不希望被贴上“正常”性别标签的人,那么您只会创建一个Male或一个Female对象 -public static Female createFemale ( )在public static Male createMale ( )您的Factory. 这样,您就可以避免所有这些麻烦。它还将摆脱像枚举一样使用的字符串(即“male”或“female”作为 的参数getPerson),但这是完全不同的事情......
如果您仍然想使用组合工厂方法,可以将结果转换为Female:
Female female = (Female) Factory.getPerson("female");
female.getPregnancyMonth ( );
Run Code Online (Sandbox Code Playgroud)
或者,如果您的 aPerson可能是也可能不是 a Female,您也可以将其强制转换:
if (person instanceof Female)
{
Female female = (Female) person;
female.getPregnancyMonth( );
}
Run Code Online (Sandbox Code Playgroud)
不过,我不能说我过于喜欢这两种方法——它们各有千秋,但通常还有更好的方法。
| 归档时间: |
|
| 查看次数: |
603 次 |
| 最近记录: |