Полиморфизм

Автор работы: Пользователь скрыл имя, 21 Декабря 2013 в 18:37, реферат

Описание работы

Полиморфи́зм (в языках программирования) — возможность объектов с одинаковой спецификацией иметь различную реализацию.
Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию — например, реализация класса может быть изменена в процессе наследования.

Содержание работы

ВВЕДЕНИЕ………………………………………………………………………….3
Полиморфизм………………………………………………………………………..4
Формы полиморфизма……………………………………………………………...8
ЗАКЛЮЧЕНИЕ……………………………………………………………………..13
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ………………………………...

Файлы: 1 файл

Полиморфизм.doc

— 99.00 Кб (Скачать файл)

 

Параметрические типы

 

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

Полиморфизм переопределения

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

 

Полиморфизм-перегрузка

 

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

      Сравнение  полиморфизма в функциональном и объектно-ориентированном программировании

      Система  классов в ФП и в ООП устроены по-разному, поэтому к их сравнению следует подходить очень осторожно.

Полиморфизм является довольно обособленным свойством языка программирования. Например, классы в C++ изначально были реализованы как препроцессор для C. Для Haskell же существует алгоритм трансляции программ, использующих специальный полиморфизм, в программы с исключительно параметрическим полиморфизмом.

      Несмотря  на концептуальные различия систем классов в ФП и ООП, реализуются они примерно одинаково — с помощью таблиц виртуальных методов. Используется часто в Java.

 

 

Постановка задачи

 

Предположим, на сайте  нужны три вида публикаций — новости, объявления и статьи. В чем-то они похожи — у всех них есть заголовок и текст, у новостей и объявлений есть дата. В чем-то они разные — у статей есть авторы, у новостей — источники, а у объявлений — дата, после которой оно становится не актуальным. 
 
          Самые простые варианты, которые приходят в голову — написать три отдельных класса и работать с ними. Или написать один класс, в которым будут все свойства, присущие всем трем типам публикаций, а задействоваться будут только нужные. Но ведь для разных типов аналогичные по логике методы должны работать по-разному. Делать несколько однотипных методов для разных типов (get_news, get_announcements, get_articles) — это уже совсем неграмотно. Тут нам и поможет полиморфизм.

 

Програмный код

 

abstract class Publication 

    // таблица, в которой хранятся данные по элементу 
    protected $table; 
     
    // свойства элемента нам неизвестны 
    protected $properties = array(); 
     
    // конструктор 
    public function __construct($id) 
    { 
        // обратите внимание, мы не знаем, из какой таблицы нам нужно получить данные 
        $result = mysql_query ('SELECT * FROM `'.$this->table.'` WHERE `id`="'.$id.'" LIMIT 1'); 
        // какие мы получили данные, мы тоже не знаем 
        $this->properties = mysql_fetch_assoc($result); 
    } 
     
    // метод, одинаковый для любого типа публикаций, возвращает значение свойства 
    public function get_property($name) 
    { 
        if (isset($this->properties[$name])) 
            return $this->properties[$name]; 
             
        return false; 
    } 
     
    // метод, одинаковый для любого типа публикаций, устанавливает значение свойства 
    public function set_property($name, $value) 
    { 
        if (!isset($this->properties[$name])) 
            return false; 
             
        $this->properties[$name] = $value; 
         
        return $value; 
    } 
     
    // а этот метод должен напечатать публикацию, но мы не знаем, как именно это сделать, и потому объявляем его абстрактным 
    abstract public function do_print(); 

 

Производные классы

 

Теперь можно перейти к созданию производных классов, которые и реализуют недостающую функциональность. 
 
class News extends Publication 

    // конструктор класса новостей, производного от класса публикаций 
    public function __construct($id) 
    { 
        // устанавливаем значение таблицы, в которой хранятся данные по новостям 
        $this->table = 'news_table'; 
        // вызываем конструктор родительского класса 
        parent::__construct($id); 
    } 
     
    // переопределяем абстрактный метод печати 
    public function do_print() 
    { 
        echo $this->properties['title']; 
        echo '<br /><br />'; 
        echo $this->properties['text']; 
        echo '<br />Источник: '.$this->properties['source']; 
    } 

 
class Announcement extends Publication 

    // конструктор класса объявлений, производного от класса публикаций 
    public function __construct($id) 
    { 
        // устанавливаем значение таблицы, в которой хранятся данные по объявлениям 
        $this->table = 'announcements_table'; 
        // вызываем конструктор родительского класса 
        parent::__construct($id); 
    } 
     
    // переопределяем абстрактный метод печати 
    public function do_print() 
    { 
        echo $this->properties['title']; 
        echo '<br />Внимание! Объявление действительно до '.$this->properties['end_date']; 
        echo '<br /><br />'.$this->properties['text']; 
    } 

 
class Article extends Publication 

    // конструктор класса статей, производного от класса публикаций 
    public function __construct($id) 
    { 
        // устанавливаем значение таблицы, в которой хранятся данные по статьям 
        $this->table = 'articles_table'; 
        // вызываем конструктор родительского класса 
        parent::__construct($id); 
    } 
     
    // переопределяем абстрактный метод печати 
    public function do_print() 
    { 
        echo $this->properties['title']; 
        echo '<br /><br />'; 
        echo $this->properties['text']; 
        echo '<br />&copy; '.$this->properties['author']; 
    } 
}

 

Теперь об использовании

 
Суть в том, что один и тот же код используется для объектов разных классов. 
 
// наполняем массив публикаций объектами, производными от Publication 
$publications[] = new News($news_id); 
$publications[] = new Announcement($announcement_id); 
$publications[] = new Article($article_id); 
 
foreach ($publications as $publication) { 
    // если мы работаем с наследниками Publication 
    if ($publication instanceof Publication) { 
        // то печатаем данные 
        $publication->do_print();  
    } else { 
        // исключение или обработка ошибки 
    }

}

 

Основная выгода полиморфизма — легкость, с которой можно создавать новые классы, «ведущие себя» аналогично родственным, что, в свою очередь, позволяет достигнуть расширяемости и модифицируемости. В данном случае показан всего лишь примитивный пример, но даже в нем видно, насколько использование абстракций может облегчить разработку. Мы можем работать с новостями точно так, как с объявлениями или статьями, при этом нам даже не обязательно знать, с чем именно мы работаем! В реальных, намного более сложных приложениях, эта выгода еще ощутимей. 
Заключение

 

      Объектно-ориентированные языки в полной мере поддерживают парадигму ООП, а именно, инкапсуляцию, наследование и полиморфизм. Типичными представителями таких языков являются C++, Java, C#.

      К объектным  языкам относят языки как минимум  поддерживающие инкапсуляцию. Они  позволяют создавать пользовательские  объекты, но, обычно не поддерживают  наследование или полиморфизм,  или же поддерживают, но не  в полной мере. Типичными представителем объектных языков являются Visual Basic до шестой версии включительно и Ada.

 

 

Список использованной литературы:

 

   1. Буч Г. Объектно-ориентированный  анализ и проектирование с  примерами приложений на C++. Пер.  с англ. М.: Бином, СПб.: Невский  диалект, 2008.208с.

   2. Буч Грейди, Рамбо  Джеймс, Джекобсон Айвар. Язык UML. Руководство пользователя. Пер. с  англ. М.: ДМК, 2008.312с.

   3. Гамма Э., Хелм  Р., Джексон Р., Влиссидес Дж. Приемы  объектно-ориентированного проектирования. Паттерны проектирования. Пер. с англ. СПб.: Питер, 2009.413с.

   4. Ларман К.  Применение UML и шаблонов проектирования / Пер. с англ. М.: Виль-ямс, 2009.295с.

  5.   Интернет источники:

 

http://az.stu.cn.ua/files/lecture/3_Polymorphism.pdf

http://humbio.ru/humbio/tarantul_sl/000010e3.htm

 


Информация о работе Полиморфизм