Концепции языков программирования Параметризованные типы данных

advertisement
Концепции языков программирования
Параметризованные типы данных
Концепции языков программирования
Параметризованные типы данных
Параметризованные типы данных поддерживают
Абстрагирование от типа
Параметрический полиморфизм
Преимущества параметризованных типов данных
Безопасность — проверка типов во время компиляции
Гибкость — один код для разных типов
Прозрачность — меньше явных преобразований типов
Эффективность — нет необходимости в проверке типов
во время выполнения
Парадигма — обобщенное программирование
Концепции языков программирования
Параметризованные типы данных в языке Ada
Один из первых языков, поддерживающий
параметризованные типы данных
Библиотека параметризованных контейнеров (Ada 2005)
При объявлении обобщенных пакетов в качестве
формальных параметров указывают значения, типы,
подпрограммы, а также экземпляры других обобщенных
пакетов и подпрограмм
При конкретизации обобщенного пакета указывают
действительные параметры, согласующиеся с
формальными
Концепции языков программирования
Параметризованные типы данных в языке Ada
Пример (Спецификация обобщенного пакета)
generic
Max_Size : Natural; -- a generic formal value
type Element_Type is private; -- a generic formal type
package Stacks is
type Size_Type is range 0 .. Max_Size;
type Stack is limited private;
procedure Create (S : out Stack;
Initial_Size : in Size_Type := Max_Size);
procedure Push (Into : in out Stack; Element : in Element_Type);
procedure Pop (From : in out Stack; Element : out Element_Type);
Overflow : exception;
Underflow : exception;
private
subtype Index_Type is Size_Type range 1 .. Max_Size;
type Vector is array (Index_Type range <>) of Element_Type;
type Stack (Allocated_Size : Size_Type := 0) is record
Top : Index_Type;
Storage : Vector (1 .. Allocated_Size);
end record;
end Stacks;
Концепции языков программирования
Параметризованные типы данных в языке Ada
Пример (Конкретизация обобщенного пакета)
type Bookmark_Type is new Natural;
package Bookmark_Stacks is new Stacks (Max_Size => 20,
Element_Type => Bookmark_Type);
Концепции языков программирования
Параметризованные типы данных в языке Ada
Пример (Конкретизация обобщенного пакета)
type Bookmark_Type is new Natural;
package Bookmark_Stacks is new Stacks (Max_Size => 20,
Element_Type => Bookmark_Type);
Пример (Использование обобщенного пакета)
type Document_Type is record
Contents : Ada.Strings.Unbounded.Unbounded_String;
Bookmarks : Bookmark_Stacks.Stack;
end record;
procedure Edit (Document_Name : in String) is
Document : Document_Type;
begin
Bookmark_Stacks.Create (S => Document.Bookmarks, Initial_Size => 10);
...
end Edit;
Концепции языков программирования
Параметризованные типы данных в языке Ada
Указание ограничений на параметры
Пример
generic
type Index_Type is (<>); -- must be a discrete type
type Element_Type is private;
type Array_Type is array (Index_Type range <>) of Element_Type;
Ограничения на параметр Array_Type зависят от других
параметров.
Концепции языков программирования
Параметризованные типы данных в языке Ada
Требуется явная конкретизация обобщенных пакетов и
подпрограмм
Компилятор может построить общий код для всех
конкретизаций обобщенного программного модуля
Позволяет избежать «вздутия» кода
Конкретизация может осуществляться не только во
время компиляции, но и во время выполнения
Концепции языков программирования
Библиотека языка Java
Пример (Без параметризованных типов — Java 1.4)
List v = new ArrayList();
v.add("test");
String a = (String) v.get(0);
Integer b = (Integer) v.get(0);
//
ошибка
Концепции языков программирования
Библиотека языка Java
Пример (Без параметризованных типов — Java 1.4)
List v = new ArrayList();
v.add("test");
String a = (String) v.get(0);
Integer b = (Integer) v.get(0);
//
ошибка
Пример (С параметризованными типами — Java 1.5)
List <String> v = new ArrayList <String> ();
v.add("test");
String a = v.get(0);
Integer b = v.get(0); // ошибка будет обнаружена
Компилятор обнаружит ошибку, т.к. ему известно, что v
— массив строк
Концепции языков программирования
Класс на языке Java
public class Pair <T, S>
{
private T first;
private S second;
public Pair(T f, S s)
// using the parameter
{
first = f; second = s;
}
public T getFirst() { return first; }
public S getSecond() { return second; }
public String toString()
{
return "(" + first.toString() + ",
" + second.toString()
}
}
Pair<String, String> name = new Pair<String,String>("John", "Smith");
Pair<String, Integer> age = new Pair<String,Integer>("John", 100);
System.out.println("name:" + name.toString());
System.out.println("age:" + age.toString());
Концепции языков программирования
Ограничения в параметризованных типах
Пример (Ограничения на возможные типы параметров в
C#)
class Sample
{
// Replaces all elements less than lowest with lowest
public static void MakeAtLeast<T>(IList<T> list, T lowest)
where T : IComparable<T>
{
for (int i = 0; i < list.Count; i++) {
if (list[i].CompareTo(lowest) < 0) {list[i] = lowest
}
}
public static void Main()
{
int[] list = {0, 1, 2, 3};
MakeAtLeast<int>(list, 2);
// change array to {2, 2,
}
}
Концепции языков программирования
Параметризованные типы данных в языке C#
Параметризованные типы данных позволяют указать
более узкий по сравнению с Object тип данных в
коллекциях
Пример
SortedList <IAccess> gr = new SortedList <IAccess>();
Параметризованные типы данных позволяют расширить
типы параметров в методах
Пример
Swap (ref int a, ref
int b);
Swap <int> (ref a, ref b);
Swap <IAccess> (ref s, rep t);
но сохраняют информацию о типах
Параметризованные типы данных облегчают внедрение
новых типов данных в существующий код
Концепции языков программирования
Система типов в .NET
Common Language Runtime (CLR) поддерживает
параметрический полиморфизм
Поскольку информация о типах доступна во время
выполнения, JIT может построить код для
специализированных вариантов параметризованных
методов
Код может использоваться совместно несколькими
специализациями одного параметризованного типа
Концепции языков программирования
..., -#$23.
VB
VC++
C#
...
JScript
, -#$23...
!"##$%&'(
)(%(*$+%,-".(//01
+,)". #(//01
!IL
Common Language Runtime
Loader
Verifier
GC
Native
Code
JIT
...
Концепции языков программирования
C#
Пример (Простые узлы)
class Node<T>
{
T m_data;
Node<T> m_next;
public Node(T data, Node<T> next)
{
m_data = data;
m_next = next;
}
// Access the data for the node
public T Data
{
get { return m_data; }
set { m_data = value; }
}
// Access the next node
public Node<T> Next
{
get { return m_next; }
set { m_next = value; }
}
// Create a linked list of integers
Node<Int32> head =
new Node<Int32>(5, null);
head = new Node<Int32>(10, head);
head = new Node<Int32>(15, head);
// Sum up integers by
// traversing linked list
Int32 sum = 0;
for (Node<Int32> current = head;
current != null;
current = current.Next)
{
sum += current.Data;
}
}
Концепции языков программирования
Download