Die Herstellung einer Schnittstelle überschreiben einer Methode, die es erbt von einer anderen Schnittstelle in PHP

StackOverflow https://stackoverflow.com/questions/16155

  •  08-06-2019
  •  | 
  •  

Frage

Gibt es eine Möglichkeit in PHP zu überschreiben einer Methode deklariert, die von einer Schnittstelle in eine Schnittstelle, die Erweiterung der Schnittstelle?

Beispiel:

Ich bin wahrscheinlich etwas falsch, aber hier ist was ich habe:

interface iVendor{
    public function __construct($vendors_no = null);
    public function getName();
    public function getVendors_no();
    public function getZip();
    public function getCountryCode();
    public function setName($name);
    public function setVendors_no($vendors_no);
    public function setZip($zip);
    public function setCountryCode($countryCode);
}

interface iShipper extends iVendor{
    public function __construct($vendors_no = null, $shipment = null);
    public function getTransitTime($shipment = null);
    public function getTransitCost($shipment = null);
    public function getCurrentShipment();
    public function setCurrentShipment($shipment);
    public function getStatus($shipment = null);
}

Normalerweise wird in PHP, wenn Sie etwas verlängern, können Sie die überschreiben-Methode darin enthalten ist (richtig?).Jedoch, wenn eine Schnittstelle erweitert eine andere, es wird nicht lassen Sie.Wenn ich bin denken über das falsche...Wenn ich die Umsetzung der iShipper-Schnittstelle, die ich nicht haben machen die VERSENDER Objekt erweitern die Hersteller object (implementiert, dass das iVendor-Schnittstelle).Ich sage nur:

class FedEx implements iShipper{}

und machen Sie FedEx implementieren Sie alle Methoden von iVendor und iShipper.Ich brauche jedoch die __construct Funktionen in iVendor und iShipper, einzigartig zu sein.Ich weiß, ich könnte nehmen Sie die $shipment = null, aber dann wäre es nicht so bequem zu erstellen Versandfirmen (einfach durch vorbei in die vendors_no und die Sendung während der Instanziierung).

Wer weiß, wie diese Arbeit zu machen?Mein fallback ist, um die Sendung durch den Aufruf $shipper->setShipment($shipment); über den Spediteur nachdem ich instanziieren, aber ich bin der Hoffnung, für eine Möglichkeit, um zu bekommen zu tun haben, dass...

Ein wenig mehr Erklärung für die neugierigen:
Die FedEx-Objekt enthält Methoden, die auf der FedEx-Website (mit cURL) und erhält einen Kostenvoranschlag für die Sendung in Frage.Ich habe ein USV-Objekt, ein BAXGlobal Objekt, eine Conway-Objekt, etc.Jeder hat GANZ unterschiedliche Methoden für die eigentlich immer dem Versand schätzen, aber das system muss wissen, ist, dass Sie ein "VERSENDER" und dass die Methoden in der Schnittstelle aufrufbar sind auf Sie haben (so dass es kann behandeln Sie alle genau das gleiche, und Durchlaufen Sie in einer "Versandfirmen" array aufrufen getTransitX() finden Sie die besten Spediteur für den Versand).

Jedes "VERSENDER" ist auch eine "Vendor" obwohl, und wird als solche behandelt, die in anderen teilen des Systems (erste und setzen in die DB, etc.Unsere Daten-design ist ein Haufen Mist, so FedEx gespeichert ist rechts neben Unternehmen wie Dunder Mifflin in der "Lieferanten" - Tabelle, die bedeutet, es wird haben alle die Eigenschaften von jedem anderen Anbieter, muss jedoch die zusätzliche Eigenschaften und Methoden geliefert, die von iShipper).

War es hilfreich?

Lösung

@cmcculloh Ja, in Java, die Sie nicht definieren Konstruktoren in Schnittstellen.Dies können Sie beide Schnittstellen erweitern und ist auch eine Klasse mehrere interfaces implementiert (beide erlaubt, und sehr nützlich in vielen Fällen) ohne sich Gedanken darüber, dass Sie erfüllen einen bestimmten Konstruktor.

EDIT:

Hier ist mein neues Modell:

A.Jede Schnittstelle verfügt nicht mehr über eine Konstruktor-Methode.
B.Alle Spediteuren (UPS, FedEx, etc) implementieren Sie nun iShipper (die sich iVendor) und erweitern die abstrakte Klasse VERSENDER (die alle gemeinsamen nicht-abstrakte Methoden für Verlader darin definiert, getName(), getZip() etc).
C.Jeder Spediteur hat seine eigene einzigartige _construct Methode überschreibt die abstrakte __construct($vendors_no = null, $shipment = null) Methode enthalten in Shipper (ich kann mich nicht erinnern, warum ich bin, so dass diejenigen, freiwillig zu sein, jetzt aber.Ich würde gehen Sie zurück durch meine Dokumentation...).

Also:

interface iVendor{
    public function getName();
    public function getVendors_no();
    public function getZip();
    public function getCountryCode();
    public function setName($name);
    public function setVendors_no($vendors_no);
    public function setZip($zip);
    public function setCountryCode($countryCode);
}

interface iShipper extends iVendor{
    public function getTransitTime($shipment = null);
    public function getTransitCost($shipment = null);
    public function getCurrentShipment();
    public function setCurrentShipment($shipment);
    public function getStatus($shipment = null);
}

abstract class Shipper implements iShipper{  
    abstract public function __construct($vendors_no = null, $shipment = null);  
    //a bunch of non-abstract common methods...  
}

class FedEx extends Shipper implements iShipper{  
    public function __construct($vendors_no = null, $shipment = null){
        //a bunch of setup code...
    }
    //all my FedEx specific methods...
}

Danke für die Hilfe!
ps.da habe ich nun Hinzugefügt, das "Ihre" Antwort, wenn es etwas gibt, über das es Ihnen nicht gefällt/denken sollte anders sein, fühlen Sie sich frei, es zu ändern...

Andere Tipps

Sie könnten drop-off der Konstruktor und legte Sie in jeder einzelnen Klasse.Dann was Sie haben, ist jede Klasse hat Ihre eigenen __Konstrukt ist, das ist wahrscheinlich das gleiche, je nachdem, wenn es einen Absender oder Anbieter.Wenn Sie möchten, dass nur jene Konstrukte definiert, sobald ich glaube, Sie wollen nicht zu gehen, dass die route.

Was ich glaube, was Sie tun möchten, ist eine abstrakte Klasse, die Verkäufer, und man realisiert, dass VERSENDER aus.Dort könnten Sie definieren Konstruktoren anders.

abstract class Vendor implements iVendor {
    public function __construct() {
        whatever();
    }
}

abstract class Shipper implements iShipper {
    public function __construct() {
        something();
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top