使一个接口覆盖它从PHP的另一个接口继承的方法
PHP中是否有办法覆盖扩展该接口的接口中的一个接口声明的方法?
这个例子:
我可能做错了什么,但是这是我所拥有的:
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的所有方法。但是,我需要iVendor和iShipper中的__construct
函数是唯一的。我知道我可以取出$ shipment = null
,但是创建发货人并不是那么方便(通过在实例化时仅传递vendor_no和发货)。
有人知道如何进行这项工作吗?我的后备方法是在实例化后必须通过在Shipper上调用$ shipper-> setShipment($ shipment);
来设置装运,但是我希望找到一种方法来解决此问题。
对好奇的更多解释:
FedEx对象具有一些方法(可使用cURL)转到FedEx站点,并获取有关货件的估算值。我有一个UPS对象,一个BAXGlobal对象,一个Conway对象等。每个对象都有完全不同的方法来实际获取运费估算值,但是所有系统需要知道的是它们是"托运人",并且其中列出的方法接口可以在它们上面调用(因此它可以将它们完全相同,并在一个名为" getTransitX()"的" shippers"数组中循环遍历它们,以找到装运的最佳发货人)。
每个" Shipper"也是一个"供应商",在系统的其他部分(获取和放入数据库等)中也是如此。我们的数据设计是一堆废话,因此FedEx与诸如"供应商"表中的Dunder Mifflin,这意味着它具有所有其他供应商的所有属性,但需要iShipper提供的其他属性和方法。
解决方案
回答
@cmcculloh是的,在Java中,我们没有在Interfaces中定义构造函数。这使我们既可以扩展接口,又可以拥有一个实现多个接口的类(都允许,并且在许多情况下非常有用),而不必担心必须满足特定的构造函数。
编辑:
这是我的新模型:
答:每个接口不再具有构造函数方法。
B.现在,所有托运人(UPS,FedEx等)都实现了iShipper(扩展了iVendor)并扩展了抽象类Shipper(为托运人定义了所有常见的非抽象方法,包括getName(),getZip()等)。
C.每个托运人都有自己独特的_construct方法,该方法会覆盖托运人中包含的抽象__construct($ vendors_no = null,$ shipment = null)方法(我不记得为什么我现在允许那些是可选的。 d必须返回我的文档...)。
所以:
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... }
谢谢帮助!
ps。由于我现在已将此问题添加到""答案中,因此如果我们不喜欢它/认为应该有所不同,请随时进行更改...
回答
我们可以放下构造函数,然后将它们放在每个单独的类中。然后,我们拥有的是每个类都有其自己的__construct,这可能是相同的,具体取决于它是托运人还是供应商。如果我们只想一次定义那些结构,那么我认为我们不想走那条路。
我认为我们想要做的是创建一个实现供应商的抽象类,并实现一个托运人的抽象类。在那里,我们可以不同地定义构造函数。
abstract class Vendor implements iVendor { public function __construct() { whatever(); } } abstract class Shipper implements iShipper { public function __construct() { something(); } }