Автор работы: Пользователь скрыл имя, 21 Декабря 2013 в 18:37, реферат
Полиморфи́зм (в языках программирования) — возможность объектов с одинаковой спецификацией иметь различную реализацию.
Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию — например, реализация класса может быть изменена в процессе наследования.
ВВЕДЕНИЕ………………………………………………………………………….3
Полиморфизм………………………………………………………………………..4
Формы полиморфизма……………………………………………………………...8
ЗАКЛЮЧЕНИЕ……………………………………………………………………..13
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ………………………………...
Параметрические типы
Вместо
того, чтобы писать класс для
каждого конкретного типа
Полиморфизм переопределения
Абстрактные
методы часто относятся к
Полиморфизм-перегрузка
Это частный случай полиморфизма. С помощью перегрузки одно и то же имя может обозначать различные методы, причем методы могут различаться количеством и типом параметров, то есть не зависят от своих аргументов. Метод может не ограничиваться специфическими типами параметров многих различных типов.
Сравнение
полиморфизма в функциональном
Система классов в ФП и в ООП устроены по-разному, поэтому к их сравнению следует подходить очень осторожно.
Полиморфизм является довольно
обособленным свойством языка
Несмотря на концептуальные различия систем классов в ФП и ООП, реализуются они примерно одинаково — с помощью таблиц виртуальных методов. Используется часто в Java.
Постановка задачи
Предположим, на сайте
нужны три вида публикаций — новости, объявления
и статьи. В чем-то они похожи — у всех них
есть заголовок и текст, у новостей и объявлений
есть дата. В чем-то они разные — у статей
есть авторы, у новостей — источники, а
у объявлений — дата, после которой оно
становится не актуальным.
Самые простые
варианты, которые приходят в голову —
написать три отдельных класса и работать
с ними. Или написать один класс, в которым
будут все свойства, присущие всем трем
типам публикаций, а задействоваться будут
только нужные. Но ведь для разных типов
аналогичные по логике методы должны работать
по-разному. Делать несколько однотипных
методов для разных типов (get_news, get_announcements,
get_articles) — это уже совсем неграмотно. Тут
нам и поможет полиморфизм.
Програмный код
abstract class Publication
{
// таблица, в которой хранятся данные
по элементу
protected $table;
// свойства элемента нам неизвестны
protected $properties =
// конструктор
public function __
{
// обратите внимание, мы не знаем, из какой
таблицы нам нужно получить данные
$result = mysql_query
// какие мы получили данные, мы тоже не
знаем
$this->properties = my
}
// метод, одинаковый для любого типа публикаций,
возвращает значение свойства
public function get_
{
if (isset($this->prope
return $this->prop
return false;
}
// метод, одинаковый для любого типа публикаций,
устанавливает значение свойства
public function set_
{
if (!isset($this->prop
return false;
$this->properties[$
return $value;
}
// а этот метод должен напечатать публикацию,
но мы не знаем, как именно это сделать, и
потому объявляем его абстрактным
abstract public function d
}
Производные классы
Теперь можно перейти к созданию производных классов,
которые и реализуют недостающую функциональность.
class News extends Publication
{
// конструктор класса новостей, производного
от класса публикаций
public function __
{
// устанавливаем значение таблицы, в которой
хранятся данные по новостям
$this->table = 'news_
// вызываем конструктор родительского
класса
parent::__construct($
}
// переопределяем абстрактный метод печати
public function do_print()
{
echo $this->properties
echo '<br /><br />';
echo $this->properties
echo '<br />Источник:
}
}
class Announcement extends Pub
{
// конструктор класса объявлений, производного
от класса публикаций
public function __
{
// устанавливаем значение таблицы, в которой
хранятся данные по объявлениям
$this->table = '
// вызываем конструктор родительского
класса
parent::__construct($
}
// переопределяем абстрактный метод печати
public function do_print()
{
echo $this->properties
echo '<br />Внимание!
echo '<br /><br />'.$
}
}
class Article extends Publicat
{
// конструктор класса статей, производного
от класса публикаций
public function __
{
// устанавливаем значение таблицы, в которой
хранятся данные по статьям
$this->table = '
// вызываем конструктор родительского
класса
parent::__construct($
}
// переопределяем абстрактный метод печати
public function do_print()
{
echo $this->properties
echo '<br /><br />';
echo $this->properties
echo '<br />© '.$
}
}
Теперь об использовании
Суть в том, что один и тот же
код используется для объектов разных
классов.
// наполняем массив
$publications[] = new News($
$publications[] = new Announce
$publications[] = new Article(
foreach ($publications as $
// если мы работаем с
if ($publication instanceo
// то печатаем данные
$publication->do_print
} else {
// исключение или
}
}
Основная выгода полиморфизма —
легкость, с которой можно создавать новые
классы, «ведущие себя» аналогично родственным,
что, в свою очередь, позволяет достигнуть
расширяемости и модифицируемости. В данном случае показан всего лишь примитивный
пример, но даже в нем видно, насколько
использование абстракций может облегчить
разработку. Мы можем работать с новостями
точно так, как с объявлениями или статьями,
при этом нам даже не обязательно знать,
с чем именно мы работаем! В реальных, намного
более сложных приложениях, эта выгода
еще ощутимей.
Заключение
Объектно-ориентированные языки в полной мере поддерживают парадигму ООП, а именно, инкапсуляцию, наследование и полиморфизм. Типичными представителями таких языков являются C++, Java, C#.
К объектным
языкам относят языки как
Список использованной литературы:
1. Буч Г. Объектно-
2. Буч Грейди, Рамбо Джеймс, Джекобсон Айвар. Язык UML. Руководство пользователя. Пер. с англ. М.: ДМК, 2008.312с.
3. Гамма Э., Хелм
Р., Джексон Р., Влиссидес Дж. Приемы
объектно-ориентированного
4. Ларман К. Применение UML и шаблонов проектирования / Пер. с англ. М.: Виль-ямс, 2009.295с.
5. Интернет источники:
http://az.stu.cn.ua/files/
http://humbio.ru/humbio/