2015-01-07 5 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

Имеет большой смысл. Тнакс @ Дэвид Чан –

Смежные вопросы