PHPで、そのインターフェイスを拡張するインターフェイスの1つのインターフェイスによって宣言されたメソッドを上書きする方法はありますか?
例:
私はおそらく何か間違ったことをしていますが、これが私が持っているものです:
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);
}
通常、PHPでは、何かを拡張するときに、そこに含まれる任意のメソッドを上書きできます(右?)。ただし、あるインターフェースが別のインターフェースを拡張する場合、それは可能になりません。これが間違っていると考えていない限り...iShipperインターフェイスを実装する場合、ShipperオブジェクトにVendorオブジェクト(iVendorインターフェイスを実装する)を拡張させる必要はありません。私はちょうど言います:
class FedEx implements iShipper{}
FedExにiVendorとiShipperのすべてのメソッドを実装させます。ただし、__construct
iVendorとiShipperの関数は一意である必要があります。を取り出すことができることはわかって$shipment = null
いますが、Shippersを作成するのはそれほど便利ではありません(インスタンス化中にvendors_noとshipmentを渡すだけです)。
誰かがこれを機能させる方法を知っていますか?私のフォールバックは、$shipper->setShipment($shipment);
インスタンス化した後に荷送人に電話して出荷を設定する必要があることですが、それを回避する方法を望んでいます...
好奇心旺盛な方へのもう少しの説明:
FedExオブジェクトには、(cURLを使用して)FedExサイトにアクセスし、問題の貨物の見積もりを取得するメソッドがあります。UPSオブジェクト、BAXGlobalオブジェクト、Conwayオブジェクトなどがあります。それぞれに、実際に配送見積もりを取得するための完全に異なるメソッドがありますが、システムが知る必要があるのは、それらが「配送業者」であり、インターフェースはそれらで呼び出すことができます(したがって、それらをすべてまったく同じように扱い、「荷送人」配列でそれらをループしてgetTransitX()
、貨物に最適な荷送人を見つけることができます)。
ただし、各「シッパー」は「ベンダー」でもあり、システムの他の部分(DBの取得と挿入など)ではそのように扱われます。データ設計はがらくたの山であるため、FedExは次のような企業と一緒に保管されます。 「ベンダー」テーブルのDunderMifflinは、他のすべてのベンダーのすべてのプロパティを取得できることを意味しますが、iShipperによって提供される追加のプロパティとメソッドが必要です。