Java: Wie kann eine Basisklasse erweitert werden, wenn andere Klassen die Basis bereits erweitern?

8

Ich möchte eine Basisklasse in Apache Commons E-Mail erweitern, die Basisklasse ist E-Mail. Ich möchte einfach eine Drosselung der .send () Methode hinzufügen

3 weitere Klassen erweitern Email: HtmlEmail, SimpleEmail und MultiPartEmail

Es gibt keine Factory-Methode zum Erstellen dieser 3 abgeleiteten Klassen.

Gibt es eine beste Möglichkeit, diese eine Methode aus der Basis-E-Mail-Klasse zu erweitern? Alles, was ich mir vorstellen kann, ist, die 3 abgeleiteten Klassen zu erweitern, in jedem das .send () zu überschreiben und jedes von ihnen eine gemeinsame statische Methode aufzurufen, um die .send () - Drosselungsfunktionalität zu erreichen.

    
David Parks 23.08.2010, 19:31
quelle

1 Antwort

19

Es sieht so aus, als könnten Sie das Dekorationsmuster verwenden und z. ein Code%. Es schmückt einfach eine andere Instanz von ThrottledEmail (es kann ANY Email Unterklasse sein) und es kann Email die @Override Methode, um eine Drosselung durchzusetzen. Alle anderen Methoden werden einfach an die zugrunde liegende send -Instanz delegiert.

Dies ist ähnlich wie ein Email funktioniert, beispielsweise. Es kann jedes java.io.BufferedReader dekorieren, um ihm eine Pufferfunktion zu geben. Weitere Beispiele sind Reader , die Hilfsmethoden wie java.util.Collections , das umschließt < em> ANY Collection<T> synchronizedCollection(Collection<T>) und dekoriert es mit Synchronisationsfunktionen.

Wenn die Basisklasse nicht eindeutig dokumentiert ist, um Unterklassen zu Collection<T> bestimmten Methoden zu erleichtern, sollten Sie die Komposition ( has-a ) im Allgemeinen über die Vererbung ( is-a ) bevorzugen ) Beziehung.

Siehe auch

  • Effektive Java 2nd Edition, Item 16: Begünstigung der Komposition über die Vererbung
  • Effektive Java 2nd Edition, Item 17: Design und Dokument für die Vererbung, oder verbiete es sonst

Verwandte Fragen

polygenelubricants 23.08.2010, 19:36
quelle

Tags und Links