2015-01-07 6 views
0

이 코드에서는 인터페이스 대신 추상 클래스를 사용하는 것이 더 좋으며 현재와 같이 좋은 것인가? 그렇다면 왜?PHP는 추상 클래스 또는 인터페이스를 사용합니까?

/** contract for all flyable vehicles **/ 
interface iFlyable { 
    public function fly(); 
} 

/* concrete implementations of iFlyable interface */ 
class JumboJet implements iFlyable { 
    public function fly() { 
     return "Flying 747!"; 
    } 
} 

class FighterJet implements iFlyable { 
    public function fly() { 
     return "Flying an F22!"; 
    } 
} 

class PrivateJet implements iFlyable { 
    public function fly() { 
     return "Flying a Lear Jet!"; 
    } 
} 

/** contract for conrete Factory **/ 
/** 
* "Define an interface for creating an object, but let the classes that implement the interface 
* decide which class to instantiate. The Factory method lets a class defer instantiation to 
* subclasses." 
**/ 
interface iFlyableFactory { 
    public static function create($flyableVehicle); 
} 

/** concrete factory **/ 
class JetFactory implements iFlyableFactory { 
    /* list of available products that this specific factory makes */ 
    private static $products = array('JumboJet', 'FighterJet', 'PrivateJet'); 

    public static function create($flyableVehicle) { 
     if(in_array($flyableVehicle, JetFactory::$products)) { 
      return new $flyableVehicle; 
     } else { 
      throw new Exception('Jet not found'); 
     } 
    } 
} 

$militaryJet = JetFactory::create('FighterJet'); 
$privateJet = JetFactory::create('PrivateJet'); 
$commercialJet = JetFactory::create('JumboJet'); 
+3

이것은 아마도 codereview.stackexchange 더 적합 .com –

+1

이것도 대부분 의견 수렴이 될 것이지만 한 가지 의견 (대답이 아닌)을 줄 것입니다. 나는 당신의 모범이 어떤 것이 더 좋을지 결정하기에는 너무 단순하다고 생각합니다. 예를 들어 특정 상황에서만 오버 라이딩 동작으로 코드 재사용 (예 : 고도 변경, 표제 변경, 이륙, 육지 변경)이 가능한 모든 비행 수단에 대해 공통적 인 동작이있는 경우 추상 클래스가 인터페이스보다 바람직합니다. –

답변

4

인터페이스가 더 유연합니다. 운항이 방법으로 모든 것이이 같은 기본 클래스에서 (다중 상속을 지원 나던 PHP)

이 너무

class bird extends animal implements flyable 
class plane extends machine implements flyable 
class cloud implements flyable 

때로는 유연성이 요구되지 않습니다 상속 강제로. 또한 여러 비행 클래스가 같은 플라이() 메소드를 필요 당신이 당신의 선택을 이해하는 데 도움이

희망하는 경우 코드 중복을 줄일 수 함수 정의를 제공 할 수

추상 클래스는

+0

많은 의미가 있습니다. Thnaks @ 데이비드 찬 –