Rozważmy na przykład, że mam klasę dla innych klas do rozszerzenia:
public class LoginPage {
public String userId;
public String session;
public boolean checkSessionValid() {
}
}
i niektóre podklasy:
public class HomePage extends LoginPage {
}
public class EditInfoPage extends LoginPage {
}
W rzeczywistości podklasa nie ma żadnych metod przesłonięcia, również nie uzyskałbym dostępu do strony głównej w sposób ogólny, tj .: nie zrobiłbym czegoś takiego:
for (int i = 0; i < loginPages.length; i++) {
loginPages[i].doSomething();
}
Chcę tylko ponownie użyć strony logowania. Ale zgodnie z https://stackoverflow.com/a/53354 powinienem tutaj preferować kompozycję, ponieważ nie potrzebuję interfejsu LoginPage, więc nie używam tutaj dziedziczenia:
public class HomePage {
public LoginPage loginPage;
}
public class EditInfoPage {
public LoginPage loginPage;
}
ale problem pojawia się tutaj, w nowej wersji kod:
public LoginPage loginPage;
duplikuje się po dodaniu nowej klasy. A jeśli LoginPage wymaga narzędzia ustawiającego i pobierającego, należy skopiować więcej kodów:
public LoginPage loginPage;
private LoginPage getLoginPage() {
return this.loginPage;
}
private void setLoginPage(LoginPage loginPage) {
this.loginPage = loginPage;
}
Więc moje pytanie brzmi: czy „kompozycja nad spadkiem” narusza „suchą zasadę”?
extends LoginPage
każdym miejscu. SZACH MAT!
LoginPage
dekoratorem. Nigdy więcej duplikacji, po prostu proste page = new LoginPage(new EditInfoPage())
i gotowe. Lub wykorzystujesz zasadę otwartego zamknięcia, aby moduł uwierzytelniania można było dynamicznie dodawać do dowolnej strony. Istnieje wiele sposobów radzenia sobie z powielaniem kodu, głównie polegających na znalezieniu nowej abstrakcji. LoginPage
jest prawdopodobnie złą nazwą, co chcesz upewnić się, że użytkownik jest uwierzytelniany podczas przeglądania tej strony, podczas gdy jest przekierowywany do LoginPage
lub wyświetla odpowiedni komunikat o błędzie, jeśli nie jest.