Вы слишком много думаете. Ваша ошибка в том, что у вас есть Person
интерфейс, MarriedPerson
и AbstractPerson
классы. Сам факт вступления в брак не меняет вашу «индивидуальность», поэтому он не должен преобразовывать экземпляр в другой класс (ie MarriedPerson
). Скорее, он изменяет состояние экземпляра, так что isMarried()
будет истинным.
Удалите лот и получите один класс:
public class Person {
private Person spouse; // getters/setters not shown
public boolean isMarried() {
return spouse != null;
}
public void marry(Person spouse) {
this.spouse = spouse;
spouse.spouse = this;
}
public void divorce() {
this.spouse = null;
spouse.spouse = null;
}
}
Примечание:
Более универсально точная модель будет иметь List<Person> spouces
, так как некоторые страны допускают супружеских супругов. Пол также вступает в игру, поскольку эти страны, как правило, разрешают мужчинам иметь нескольких супругов, и все эти супруги должны быть женщинами (однополые браки запрещены во многих странах), поэтому класс Man
будет иметь List<Female>
и Female
будут иметь Man spouse
.
Не называть женскую версию Woman
было преднамеренным, так как в некоторых странах брак женщины допускается до достижения ими половой зрелости, и поэтому технически не будет классифицироваться как женщина.