Поиск подтверждения или руководства по использованию абстрактного класса в Php - PullRequest
1 голос
/ 12 ноября 2010

В основном я ищу отзывы или рекомендации о том, что я создал на этой неделе на работе. Проблема была в том, что у меня было два типа загрузки документов. Оба эти типа являются общими методами, такими как upload, isUploaded, move и т. Д. Но в некоторых случаях они оба имели уникальную функциональность.

Поэтому я подумал, что лучший подход для этого - создать абстрактный класс, который содержит общую функциональность и 2 отдельных класса, которые расширяют базовый абстрактный класс для наследования общей функциональности.

Итак, у меня есть:

abstract class Upload {

 protected $_id;
 protected $_name;
 protected $_dbTable;

 abstract public function create(Filter $filter) {}
 abstract public function update(Filter $filter) {}

 public function __construct($id){
  if(!is_null($id)){
   $class = new get_called_class();
   return new $class($id);
  }
 }

 protected function upload(){
  //Code implemented
 }

 protected function isUploaded(){
  //Code implemented
 }

 protected function move(){
  //Code implemented
 }

}

Class Book_Upload extends Upload {

 $dbTable = 'book';

 public function __construct($id){
  //Database stuff to obtain record information
  //Set protected member variables
  $results = $databaseCall();
  $this->_id = $results['id'];
  $this->_name = $results['name'];
 }

 public function create(Filter $filter) {
  //Code implemented
 }

 public function update(Filter $filter) {
  //Code implemenetd
 }

 //Other unique functions

}

Class Magazine_Upload extends Upload {

 $dbTable = 'magazine';

 Same as Booking_Upload but with additional functionality
 plus abstract methods

}

Мой вопрос: правильно ли я использую абстрактные методы? Я пошел по правильному пути. Кроме того, я не уверен, что мне нужна конструкция в абстрактном классе. Что если кто-то попытается вызвать $ upload = new Upload ($ id)?

Ответы [ 2 ]

0 голосов
/ 13 ноября 2010

Любой класс должен обеспечивать функциональность одного типа (например, принцип единой ответственности: Принцип единой ответственности - Трудно увидеть пример? ).

Класс загрузки должен иметь дело только сдобавления.Без большего количества кода я чувствую чересчур функциональный класс из ваших слов, который пытается выполнить задачи загрузки и специальных документов.

Поэтому, прежде чем идти по этому пути, вы должны хорошо определить, что будут делать эти классы.Действительно ли эти специфичные для документа функции связаны с фактическим актом загрузки?

0 голосов
/ 12 ноября 2010

Вы расширяете класс, не вызывая parent :: __ construct (), поэтому абстрактный __construct не будет иметь никакого значения.

Вы используете абстрактные классы правильно;они являются базовыми классами, которые должны быть построены другими классами, которые совместно используют общие функции и / или будут иметь ту же функциональность, но реализованы по-разному.

Абстрактные классы - это основа, на которой строятся общие функции иструктура для других классов.

...