을 만드는 하나의 인터페이스를 덮어쓰는 방법에서 상속 다른 인터페이스에서 PHP

StackOverflow https://stackoverflow.com/questions/16155

  •  08-06-2019
  •  | 
  •  

문제

는 방법이 있 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 때,당신은 확장,뭔가를 덮어쓸 수 있습니다 거기에 포함된 어떠한 방법(right?).그러나,하나의 인터페이스는 다른 확장,그것은 당신을 못하게합니다.지 않는 한 나는 생각이 잘못된...을 때 나를 구현하 iShipper 인터페이스,나를 만들어야 하지 않는 선적 객체로 확장 공급업체 개체(를 구현하는 iVendor 인터페이스).나는 단지 말:

class FedEx implements iShipper{}

와 페덱스를 모두 구현하는 방법에서 iVendor 및 iShipper.그러나,필요 __construct 기능 iVendor 및 iShipper 게 고유합니다.나는 알 수 있었을 꺼내 $shipment = null, 지만,하여 다음을 수행할 수 있습니다로 편리하게 작성주(에 의해 전달에서 vendors_no 및 배송하는 동안 인스턴스).

누구나 알고 어떻게 작동하나요?나 대체가를 설정해야에 의하여 선적 전화 $shipper->setShipment($shipment); 에서 발송 후 나는 인스턴스화,그러나 나에 대한 기대를 피하는 방법을 할 필요는...

조금 더에 대한 설명이 궁금:
페더럴 익스프레스 객체는 방법으로 이동하는 페더럴 익스프레스 사이트(사용하여 컬)면 견적서를 발송합니다.나는 업체 BAXGlobal 개체웨이 Object,etc.각각의 하나는 완전히 다른 방법을 실제로 운송 예측하지만,모든 시스템을 필요가 알고 있는 그들은"shipper"그리고 방법들을 통해 나열된 인터페이스에서 호출에 그들이(할 수 있도록 그들을 치료하는 모든이 정확히 동일한,및 루프를 통해 그들이"선적회사"배열 전화 getTransitX() 을 찾기 위해 최선 발송한 배송).

각각의"선적회사"또는"공급업체에"하지만,은 같은 치료에서 시스템의 다른 부분(받고에서 DB,etc.우리의 데이터 디자인은 사용,그래서 페덱스 저장된 권리와 함께 회사는 다음과 같 Dunder Mifflin 에서"업체"테이블을 의미하는,그것을 가져옵의 속성이 모두 다른 모든 공급업체이지만,필요한 추가 특성과 방법에 의해 공급되 iShipper).

도움이 되었습니까?

해결책

@cmcculloh 그래서,자바를 정의하지 않지 생성자 인터페이스가 있습니다.이것은 당신에 모두 인터페이스를 확장하고 있는 클래스를 구현하는 여러 인터페이스(양쪽을 허용하고 매우 많은 경우에 유용)걱정하지 않고 충족하는 데 특정 생성자입니다.

편집:

여기에 내 새로운 모델:

A.각 인터페이스는 더 이상 생성자 방법입니다.
B.모든 선적회사(UPS,페더럴 익스프레스,등등)이를 구현하 iShipper(확장 iVendor)및 연장 추상 클래스 발송(는 모든 일반적 방법에 대한 선적을 정의에서,그것 getName(),getZip()etc.).
C각 발송인은 그것의 자신의 독특한 _construct 방법을 덮어쓰고 추상적인__construct($vendors_no=null,$선적=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.때문에 나는 지금 추가 이하"귀하"대답하는 경우에 대해 뭔가가있다 당신이 좋아하지 않/해야 한다고 생각하는 것 다른,을 변경하시기 바랍니다...

다른 팁

수락 생성자 및 그냥 넣어서 각 클래스입니다.그때 당신은 각 클래스는 자신의__을 구성하는,아마도에 따라 동일하다면 그것은 발송인이거나 공급 업체입니다.하려는 경우에만 그 구조물이 정의되 나는 생각하지 않는 당신이 가고 싶은 아래하는 경로입니다.

내가 무슨 생각을 하고 싶다는 추상 클래스를 구현하는 공급업체 중 하나를 구현하는 발송입니다.거기 당신은 수 있을 정의 생성자를 다릅니다.

abstract class Vendor implements iVendor {
    public function __construct() {
        whatever();
    }
}

abstract class Shipper implements iShipper {
    public function __construct() {
        something();
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top