注意:這是一個 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,并將方法覆寫到使用這些方法的類中,或者可能有更好的方法來解決這個問題。順便說一句,設計模式中的新事物......
也許我過度設計,但我真的想以一種好的方式做到這一點。
謝謝
uj5u.com熱心網友回復:
它可能會幫助您繪制圖表,但我們可以通過它進行討論。
介面的不同實作者擁有其他人沒有的方法是完全正常的。介面指定了所有實作者共享的方法,當您向介面編碼時,您只需呼叫這些方法,而不是類也可能宣告的其他方法。iterface 的任何實作都可以與任何其他實作互換使用。客戶端并不關心實作者有哪些其他方法,它只對使用介面方法感興趣。
但是不充當介面客戶端的代碼可能會以完全不同的方式查看實作。其他一些代碼可能會構造一個新的 SpaceShip 并呼叫 getSpaceEquipment()。這也很正常。如果你構造了一個新的 Truck,那么你不能呼叫 getSpaceEquipment() 因為那個類沒有那個方法。
將 getSpaceEquipment() 之類的方法添加到 Truck 和 SpaceShip 都實作的介面中是錯誤的,比如 Vehicle。getSpaceEquipment() 僅對 SpaceShip 有意義,不適用于所有車輛。
您可以創建一個名為 SpaceVehicle 的 Vehicle 擴展,并在其中宣告 getSpaceEquipment() 方法。然后 SpaceShip 可以實作 SpaceVehicle(這使得它也是一個 Vehicle 通過繼承)。但是,只有當您有多個 SpaceVehicle 的實作者并且您需要撰寫與 SpaceVehicle 實體一起使用的代碼但不關心 SpaceVehicle 是 SpaceShip 還是 Satelite 或其他任何東西時,您才會這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/365915.html
上一篇:PHP日期格式變數
