Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Обобщенные или параметризованные классы



Идея обобщенных классов достаточно очевидна и заключается в следующем: использовать при описании классов не конкретные типы свойств (например, целые или вещественные), а некие обобщенные типы с возможностью последующей замены их необходимыми конкретными типами. В этом случае тип свойства можно рассматривать как параметр класса и поэтому сами классы называть параметризованными.

Наиболее широко механизм обобщенных классов реализован в языке С++, где он является одним из базовых понятий. При этом обобщенными могут объявляться не только классы, но и их методы и просто обычные функции. В языке С++ этот подход определяется термином «шаблон» (template). Он очень широко используется при написании программ (см. например [12], где шаблоны используются для реализации всех основных структур данных и алгоритмов их обработки). Например, вместо создания нескольких вариантов программного кода сортировки для разных типов создается один вариант, использующий обобщенный тип данных. Дальнейшая работа по конкретизации типов возлагается на компилятор. Следовательно, использование шаблонов позволяет существенно сократить объем исходного программного кода, переложив часть работы на компилятор.

Многолетняя удачная практика использования шаблонов при написании программ на С++ привела к тому, что аналогичные идеи были воплощены и в других объектных языках. В частности, версия языка Java 1.5 включает понятие обобщенных (generic) классов. Необходимо отметить, что полного тождества между generic-классами и шаблонами нет в силу специфических особенностей платформы Java.

Поскольку пока наиболее полно обобщенные классы реализованы в языке С++, дальнейшее изложение будет ориентировано именно на этот язык. В силу того, что описание шаблонных классов может включать шаблонные методы, сначала необходимо рассмотреть использование шаблонных функций. Механизм обобщенных классов появился в последней на данный момент версии платформы.NET Framework 2.0.

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

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

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

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

Описание шаблонной функции начинается с директивы template, после которой в угловых скобках с помощью директивы class задается список имен обобщенных типов (в нашем примере достаточно одного обобщенного типа):

template < class MyType> // MyType - имя обобщенного типа

int Find (MyType mas [ ], int n, MyType key)

{ for (int i = 0; i < n; i++)

if (mas[i] == key) then return i;

return -1;

};

Эту шаблонную функцию можно вызывать для массивов с разным типом элементов, например:

int A[10]; // объявление массива целых чисел

float B[100]; // объявление массива вещественных чисел

index1 = Find (A, 10, 5); // вызов ШФ с целым типом

index2 = Find (B, 80, 1.5); // вызов ШФ с вещественным типом

Именно при обработке последних двух строк компилятор создаст два варианта машинного кода для разных типов данных. Схематично это можно представить следующим образом:


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

Пример описания простого шаблонного класса:

template < class MyType> // заголовок шаблонного класса

class Simple // обычный заголовок класса

{ private:

MyType item; // свойство с обобщенным типом

public:

Simple(MyType aitem); // конструктор с обобщенным параметром

void SetItem(MyType aitem) { item = aitem;}

MyType GetItem(); // метод с выходным обобщенным типом

};

Программная реализация методов как шаблонных функций:

template < class MyType> // заголовок конструктора как ШФ

Simple<MyType>::Simple(MyType aitem)

{ item = aitem;}

template < class MyType> // заголовок Get-метода как ШФ

MyType Simple<MyType>::GetItem()

{ return item;}

Замена обобщенных типов, используемых в классе, на реальные типы выполняется компилятором при обработке строк, в которых объявляются объекты шаблонного класса. Эти объявления должны содержать указания конкретных типов, заменяющих обобщенные.

Примеры объявления объектов класса Simple различного типа:

Simple<int> MyIntObj; // объект с целочисленным свойством

Simple<float> MyFloatObj; // объект с вещественным свойством

Simple<Student> MyStud; // объект со свойством типа Student

Огромным достоинством языка С++ является наличие мощной встроенной библиотеки стандартных шаблонов STL (Standard Template Library). Эта библиотека содержит, в частности, целый ряд шаблонных контейнеров (Vector, List, Stack, Queue, Map). Данные классы позволяют создавать контейнеры для хранения объектов необходимых типов [10].





Дата публикования: 2014-11-02; Прочитано: 1443 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...