Не добавляйте getPregnancyMonth
к Person
. Как вы обнаружили, это не имеет особого смысла.
В объектно-ориентированном программировании базовый класс / интерфейс должен (в идеале) содержать только те детали, которые являются общими для каждого из его подклассов - поскольку getPregnancyMonth
не является общим для обоих подклассов (это не имеет никакого смысла для Male
), оно не должно быть в интерфейсе Person
. Еще раз подчеркиваю - речь идет об идеалах.
Как и предлагали другие ответы, постарайтесь вообще избежать этой проблемы, если можете. Например, вы можете использовать instanceof
, чтобы определить, является ли данный Person
Male
или Female
, и вызывать getPregnancyMonth
, только если Person
является Female
.
Редактировать , в ответ на комментарий: использование описанного фабричного метода в значительной степени бессмысленно. Если мы игнорируем тех людей, которые не хотят, чтобы их называли «нормальным» полом, вы когда-либо создадите объект Male
или Female
- вам гораздо лучше просто иметь public static Female createFemale ( )
и public static Male createMale ( )
методы в вашем Factory
. Таким образом, вы избежите всех этой проблемы, с которой вы столкнулись. Это также избавит от строки, используемой как enum (то есть "male" или "female" в качестве аргумента getPerson
), но это совсем другое дело ...
Если вы все еще хотите использовать комбинированный фабричный метод, вы можете привести результат как Female
:
Female female = (Female) Factory.getPerson("female");
female.getPregnancyMonth ( );
Или, если у вас есть Person
, который может быть или не быть Female
, вы также можете разыграть его:
if (person instanceof Female)
{
Female female = (Female) person;
female.getPregnancyMonth( );
}
Не могу сказать, что мне слишком нравится любой из этих подходов - у них есть свое место, но обычно есть лучший способ.