Angenommen, ich habe eine Klasse für andere Klassen, die erweitert werden sollen:
public class LoginPage {
public String userId;
public String session;
public boolean checkSessionValid() {
}
}
und einige Unterklassen:
public class HomePage extends LoginPage {
}
public class EditInfoPage extends LoginPage {
}
Tatsächlich hat die Unterklasse keine Methoden zum Überschreiben. Außerdem würde ich nicht generisch auf die HomePage zugreifen, dh: Ich würde nicht Folgendes tun:
for (int i = 0; i < loginPages.length; i++) {
loginPages[i].doSomething();
}
Ich möchte nur die Anmeldeseite wiederverwenden. Laut https://stackoverflow.com/a/53354 sollte ich hier jedoch die Komposition bevorzugen, da ich die Schnittstelle LoginPage nicht benötige. Daher verwende ich hier keine Vererbung:
public class HomePage {
public LoginPage loginPage;
}
public class EditInfoPage {
public LoginPage loginPage;
}
aber das problem kommt hier, bei der neuen version, der code:
public LoginPage loginPage;
dupliziert, wenn eine neue Klasse hinzugefügt wird. Und wenn LoginPage Setter und Getter benötigt, müssen mehr Codes kopiert werden:
public LoginPage loginPage;
private LoginPage getLoginPage() {
return this.loginPage;
}
private void setLoginPage(LoginPage loginPage) {
this.loginPage = loginPage;
}
Meine Frage lautet also: Verstößt "Komposition über Vererbung" gegen das "Trockenprinzip"?
extends LoginPage
überall ein Duplikat . CHECK MATE!
LoginPage
einem Dekorateur. Keine Vervielfältigung mehr, nur ein einfaches page = new LoginPage(new EditInfoPage())
und Sie sind fertig. Oder Sie verwenden das Open-Closed-Prinzip, um das Authentifizierungsmodul zu erstellen, das dynamisch zu jeder Seite hinzugefügt werden kann. Es gibt viele Möglichkeiten, mit Code-Duplikaten umzugehen, vor allem, wenn eine neue Abstraktion gefunden werden soll. LoginPage
Wahrscheinlich handelt es sich um einen schlechten Namen. Wenn dies nicht der Fall ist, möchten Sie sicherstellen, dass der Benutzer beim Browsen auf dieser Seite authentifiziert wird und zur LoginPage
entsprechenden Fehlermeldung umgeleitet wird.