gpt4 book ai didi

php - 在 PHP 中使一个接口(interface)覆盖它从另一个接口(interface)继承的方法

转载 作者:行者123 更新时间:2023-12-04 23:53:04 27 4
gpt4 key购买 nike

PHP 中是否有一种方法可以在扩展该接口(interface)的接口(interface)中覆盖由一个接口(interface)声明的方法?

示例:

我可能做错了什么,但这是我所拥有的:

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 中,当您扩展某些内容时,您可以覆盖其中包含的任何方法(对吗?)。然而,当一个接口(interface)扩展另一个接口(interface)时,它就不会让你这样做。除非我想错了...当我实现 iShipper 接口(interface)时,我不必使 Shipper 对象扩展 Vendor 对象(实现 iVendor 接口(interface))。我只想说:

class FedEx implements iShipper{}

并使 FedEx 实现 iVendor 和 iShipper 的所有方法。但是,我需要 iVendor 和 iShipper 中的 __construct 函数是唯一的。我知道我可以取出 $shipment = null,但是创建 Shippers 就不太方便了(只需在实例化时传入vendors_no 和发货)。

有人知道如何实现这个功能吗?我的后备方案是在实例化 Shipper 后通过调用 $shipper->setShipment($shipment); 来设置发货,但我希望有一种方法可以避免这样做那...

为好奇的人提供更多解释:
FedEx 对象具有访问 FedEx 站点(使用 cURL)并获取相关货件估计值的方法。我有一个 UPS 对象、一个 BAXGlobal 对象、一个 Conway 对象等。每个对象都有完全不同的方法来实际获取运费估算,但系统需要知道的是它们是“托运人”,并且在接口(interface)可在它们上调用(因此它可以完全相同地对待它们,并在调用 getTransitX() 的“shippers”数组中循环遍历它们,以找到 cargo 的最佳托运人)。

每个“托运人”也是一个“供应商”,并且在系统的其他部分(获取和放入数据库等)也被视为“供应商”。我们的数据设计是一堆垃圾,所以 FedEx与 Dunder Mifflin 等公司一起存储在“供应商”表中,这意味着它可以拥有所有其他供应商的所有属性,但需要 iShipper 提供的额外属性和方法。

最佳答案

@cmcculloh是的,在 Java 中,你不在接口(interface)中定义构造函数。这使您既可以扩展接口(interface),又可以拥有一个实现多个接口(interface)的类(两者都是允许的,并且在许多情况下非常有用),而不必担心必须满足特定的构造函数。

编辑:

这是我的新模型:

A.每个接口(interface)不再有构造函数。
B.所有托运人(UPS、FedEx 等)现在都实现 iShipper(它扩展了 iVendor)并扩展了抽象类 Shipper(其中定义了托运人的所有常见非抽象方法,getName()、getZip() 等)。
C.每个 Shipper 都有自己独特的 _construct 方法,该方法会覆盖 Shipper 中包含的抽象 __construct($vendors_no = null, $shipment = null) 方法(我不记得为什么现在允许这些方法是可选的。我有返回我的文档...)。

所以:

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。因为我现在已将其添加到“您的”答案中,如果您不喜欢/认为应该有所不同,请随时更改它......

关于php - 在 PHP 中使一个接口(interface)覆盖它从另一个接口(interface)继承的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16155/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com