0

注意:这是一个 PHP 项目

我有一种情况,我为我的项目使用了 2 个 API 提供程序。它们与它们(API)提供的信息相似。我必须设置正确的方式,因为也许明天会添加更多的 API。所以我的项目需要一些方法。基本的,这是我到目前为止所拥有的:

abstract class A {}// first api class, mostly contains API configs and call 
abstract class B {}// second api class, also mostly contains API configs and call 

//than first API has a sub classes of something like cars and trucks
class Car extends A implements ApiMethodsInterface {} // for the cars 
class Truck extends A implements ApiMethodsInterface {} // for the trucks

//now second API has a sub classes for cars , trucks and spaceships
class Car extends B implements ApiMethodsInterface {} // for the cars
class Truck extends B implements ApiMethodsInterface {} // the trucks
class SpaceShip extends B implements ApiMethodsInterface {} // for the space ships

//they all have more or less similar methods 
// so i used an Interface that all above classes 
interface ApiMethodsInterface
    //methods are
    public function getModels()
    
    public function getYears()

    public function getPrice()

由于每个子类都实现了这个接口,我按接口编码

现在,我有一种情况,SpaceShips 有更多方法要添加,比如 getEquipment() 和更多信息,其他类没有实现的方法。Trucks 还有更多其他人没有实现的方法,例如 hasTrailer()、trailerLength() 等...

我的问题是,现在该怎么办,我应该使用接口隔离,并将接口添加到实现这些方法的类中,然后检查实例化的对象是否具有此方法而不是运行,否则会出现异常,或者将缺少的模型添加到抽象中类 A 和 B,并将方法覆盖到使用这些方法的类中,或者也许有更好的方法来解决这个问题。顺便说一句,设计模式很新……

也许我过度工程,但我真的想以一种好的方式做到这一点。

谢谢

4

1 回答 1

0

它可能会帮助您绘制图表,但我们可以通过它来讨论。

接口的不同实现者拥有其他人没有的方法是完全正常的。接口指定了所有实现者共同共享的方法,当您对接口进行编码时,您只需调用这些方法,而不是类也可能声明的其他方法。iterface 的任何实现都可以与任何其他实现互换使用。客户端并不关心实现者还有哪些其他方法,它只对使用接口方法感兴趣。

但是不作为接口客户端的代码可能会以完全不同的方式查看实现。其他一些代码可能会构造一个新的 SpaceShip 并调用 getSpaceEquipment()。这也是正常的。如果您构建一个新的卡车,那么您不能调用 getSpaceEquipment(),因为该类没有该方法。

将 getSpaceEquipment() 之类的方法添加到 Truck 和 SpaceShip 都实现的接口(例如 Vehicle)是错误的。getSpaceEquipment() 仅对 SpaceShip 有意义,不适用于所有车辆。

可以创建一个名为 SpaceVehicle 的 Vehicle 扩展,并在其中声明 getSpaceEquipment() 方法。然后 SpaceShip 可以实现 SpaceVehicle (通过继承使其也成为 Vehicle)。但是,只有当您有多个 SpaceVehicle 的实现者并且您需要编写与 SpaceVehicle 实例一起使用但不关心 SpaceVehicle 是 SpaceShip 还是 Satelite 或其他任何东西时,您才会这样做。

于 2021-11-25T16:43:32.360 回答