具有两种不同实现的接口

gat*_*cea 7 java oop inheritance

我有一个接口Person,我有2个类,FemaleMale实现了接口.

对于女班,我有一个getPregnancyMonth我的男班没有的方法.将该方法添加到我的界面Person成为一个问题,因为我的Male类现在需要从接口继承该方法; 但男性永远不会怀孕.

什么是解决方案,我需要extend人而不是implement吗?

编辑:对不起,如果我的问题不明确.在这种情况下我已经添加两者get/ set从方法MaleFemale类的接口.

    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,我的男性必须将该方法添加到具体类来实现接口.有办法避免这种情况吗?

Sha*_*awn 5

getPregnancyMonth不应该在界面中Person.

个人......没有任何双关语...我认为你应该创建Person一个抽象类,因为女性和男性将分享许多相同的属性和功能.

然后,您可以创建反映每个性别的独特功能的女性和男性界面.


Mac*_*Mac 1

不要添加getPregnancyMonthPerson. 正如您所发现的,这没有多大意义。

在面向对象编程中,基类/接口(理想情况下)应该只包含其每个子类所共有的细节 - 因为这对于getPregnancyMonth两个子类来说并不常见(它对于 a 没有任何意义Male),所以它不应该位于Person界面中。我再次强调——这是在谈论理想。

正如其他答案所建议的,如果可以的话,尽量完全避免这个问题。例如,您可以使用instanceof来检测给定是否Person是 aMaleFemale,并且仅getPregnancyMonthPerson是 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)

不过,我不能说我过于喜欢这两种方法——它们各有千秋,但通常还有更好的方法。