Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Абстрактные классы и методы 
V
    Опции темы
underW
Дата 8.7.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 22.9.2008

Репутация: 1
Всего: 3



Сейчас вот стал более глубоко вникать в ООП в PHP, так вот:

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

Код

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


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

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

Код

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


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

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

Спасибо.
PM MAIL   Вверх
MoLeX
Дата 8.7.2009, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



 smile 


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
icewind
Дата 8.7.2009, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 11.4.2009
Где: Ростов-на-Дону

Репутация: 20
Всего: 20



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


--------------------
user posted image
PM MAIL Skype   Вверх
underW
Дата 9.7.2009, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 22.9.2008

Репутация: 1
Всего: 3



icewind,ну и что? каким образом это объясняет нужность абстрактных классов?
PM MAIL   Вверх
QryStaL
Дата 9.7.2009, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 1
Всего: 32



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.


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
ksnk
Дата 9.7.2009, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



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

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Sentox
Дата 9.7.2009, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



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

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

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

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

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

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

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

Это сообщение отредактировал(а) Sentox - 9.7.2009, 09:51
PM MAIL   Вверх
solenko
Дата 9.7.2009, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 34
Всего: 67



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

<?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 абсолютно не важно куда будет сохранятся его логи, но важно знать интерфейс логгера. Указывая в проверке типа более общий класс мы как раз добиваемся поставленной задачи


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
underW
Дата 9.7.2009, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 22.9.2008

Репутация: 1
Всего: 3



ребят, спасибо, дошло smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0511 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.