Daniel Thoma: Klassen überlagern

Beitrag lesen

Hallo Olaf,

Die Semantik einer Sprache zu verändern ist immer etwas gefährlich. Ein "new Klasse" sollte auch eine neue Instanz dieser Klasse erzeugen, wenn man diese beim Laden durch eine andere ersetzt, sollte man genau wissen, warum man das tut. So etwas machen typischerweise irgend welche Datenbankabstraktionsschichten o.ä. die die zu ladende Klasse bspw. um Funktionalität für den transparenten Datenbankzugriff ergänzen. Dies ist aber transparent, d.h. die geladene Klasse hat im wesentlichen die Funktionalität des Originals und von den Änderungen merkt man von außen nichts (oder fast nichts ;).
Aus diesem Grund würde ich in dem Fall einen Factory-ähnlichen Mechanismus bevorzugen.

Du willst ja erreichen, dass Du die Implementierung der Schnittstelle austauschen kannst. Ich würde also einen zentralen Dienst in der Anwendung vorsehen, der es ermöglicht, für Schnittstellen Implementierungen zu erhalten.
Ich weiß nicht genau, wie man das in PHP machen würde, aber ich stelle mir das in etwa so vor:

  
public class ServiceProvider {  
  
  private ServiceProvider sp;  
  
  public static SeviceProvider getInstance() {  
    if (sp == null) {  
      sp = new ServiceProvider();  
    }  
    return sp;  
  }  
  
  public Object createServiceInstance(SerivceType type) {  
    ...  
  }  
  
}  

Offen ist, wie man den "SeviceType" genau spezifiziert. In Java würde man da typischerweise ein Interfaces angeben. In einer Scriptsprache tut es vermutlich auch einfach ein String mit dem Namen des Dienstes.

Nun ist noch zu überlegen, wie man dann am besten die Implementierung findet. In der einfachsten Variante machst Du das einfach wie bisher, und suchst entsprechend einer Namenskonvention in einem Verzeichnis für die Standardimplementierungen und einem für die erweiterten Implementierungen.

Typischerweise würde jede Implementierung dann eine Schnittstelle implementieren. Da PHP (meines Wissens) über so etwas gar nicht verfügt, kann man die Vererbung völlig offen lassen. Die implementierenden Klassen kann man von jeder anderen Klasse erben lassen.

Grüße

Daniel