Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Абстрактные классы и методы


Автор: underW 8.7.2009, 13:37
Сейчас вот стал более глубоко вникать в ООП в PHP, так вот:

Абстрактные классы и методы
Абстрактные методы имеют только объявление и не имеют реализации. Класс, который содержит такие методы, должен быть обязательно объявлен как абстрактный:

Код

<?
    abstract class MyClass {
        abstract public function fn();
    }
?>


Это все понятно, как объявлять и что это такое, НО ну никак не могу понять, зачеееем они надо????

Вот нашел такую цитату: 

Код

А зачем тогда нужны абстрактные методы и классы? А чтобы описать объект, который будет реализован, но который еще не реализован.


Зачем описывать объект, который будет реализован, но еще не реализован? В чем суть абстрактного класса??? 

Можно объяснить на пальцах?

Спасибо.

Автор: MoLeX 8.7.2009, 13:46
 smile 

Автор: icewind 8.7.2009, 14:28
Экземпляры абстрактных классов не могут быть созданы.  По этому они носят чисто описательный характер. Однако абстрактный класс не обязательно состоит только из абстрактных методов. Он может содержать методы с реализацией. Но если у класса есть хоть один абстрактный метод, то он сам должен быть объявлен как абстрактный

Автор: underW 9.7.2009, 00:20
icewind,ну и что? каким образом это объясняет нужность абстрактных классов?

Автор: QryStaL 9.7.2009, 09:13
underW, почитайте про концепцию полиморфизма.

Through inheritance, a class can be used as more than one type; it can be used as its own type, any base types, or any interface type if it implements interfaces. This is called polymorphism. Polymorphism is important not only to the derived classes, but to the base classes as well. Anyone using the base class could, in fact, be using an object of the derived class that has been cast to the base class type. Designers of a base class can anticipate the aspects of their base class that are likely to change for a derived type.

Автор: ksnk 9.7.2009, 09:25
Цитата(underW @  9.7.2009,  00:20 Найти цитируемый пост)
ну и что? каким образом это объясняет нужность абстрактных классов? 

Абстрактные классы - это рамки, в которых развивается модель классов. Можно писать письмо на листочке в клеточку, можно на a4, а можно на листе обоев. Смысл выбора типа бумаги выясняется уже потом, когда приходится письмо отправлять по обычной почте, складывать в папочку или вешать на стену... 

Автор: Sentox 9.7.2009, 09:40
Может такое обьяснение подойдёт.
Есть класс "животные", но ведь "чистого обьекта" в природе не существует.
По сути дела передавая информацию "животные" мы понимаем что это "обьекты(классы)" -  собаки, кошки, ..... и т.д. и каждый имеет общую функциональность от класса "животные" ходить по земле, но в то же время имеют различные функции.

Основная роль абстрактного класса дать группе обьектов (классов, которые наследуют абстрактный) один тип для последующего использования например:
Код

<?
abstract class Animal {
    // .... реализация
}

class Wolf extends Animal {
    // .... реализация
}

class Examle {
    
    public static function run(Animal $animal)
    {
          $any_animal = $animal;
     }
}
?>

Теперь в метод run() будут передаваться обьекты ТОЛЬКО типа Animal. Иначе интерпретатор вызовет ошибку, обеспечив функциональность метода за счёт передачи определённого типа.

Ну вот что то типа того ...

Автор: solenko 9.7.2009, 10:20
пример, который, надеюсь, снимет вопросы:
Код

<?php
abstract class AbstactLogger {
    const MESSAGE_TYPE_ERROR = 'error';
    const MESSAGE_TYPE_DEBUG = 'debug';
    const MESSAGE_TYPE_WARNING = 'warning';
    
    protected function formatMessage($message, $type) {
        return '['.date('Y-m-d H:i:s').'] ['.$type.'] '.$message;
    }
    
    public function log($message, $type = '') {
        if (!$type) {
            $type = self::MESSAGE_TYPE_ERROR;
        }
        $message = $this->formatMessage($message, $type);
        $this->saveLog($message, $type);
    }
    
    protected abstract function saveLog($message, $type) {}
    
}

class FileLogger extends AbstractLogger {
    private $log_file;
    public function __construct($log_file) {
        $this->log_file - $log_file;
    }
    
    protected function saveLog($message, $type) {
        $fh = fopen($this->log_file, 'a');
        fwrite($fh, $message);
        fclose($fh);
    }
}

class ConsoleLog extends AbstractLogger {
    protected function saveLog($message, $type) {
        echo $message;
    }
}

class Foo {
           public function __construct(AbstractLogger $logger) {}
}


Что мы имеем в итоге:
1. Один общий абстрактный класс и два специальных класса
2. Т.к. специальные классы наследуются от абстрактного, то имеют общий интерфейс
3. Абстрактный класс содержит реализацию, а, значит, код общих функций не дублируется как в случае использования интерфейса
4. Т.к. общий класс абстрактный, мы можем быть уверенны, что никто не будет пытатся его инстанцировать
5. Классу Foo абсолютно не важно куда будет сохранятся его логи, но важно знать интерфейс логгера. Указывая в проверке типа более общий класс мы как раз добиваемся поставленной задачи

Автор: underW 9.7.2009, 22:48
ребят, спасибо, дошло smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)