Концепции языков программирования Параметризованные типы данных Концепции языков программирования Параметризованные типы данных Параметризованные типы данных поддерживают Абстрагирование от типа Параметрический полиморфизм Преимущества параметризованных типов данных Безопасность — проверка типов во время компиляции Гибкость — один код для разных типов Прозрачность — меньше явных преобразований типов Эффективность — нет необходимости в проверке типов во время выполнения Парадигма — обобщенное программирование Концепции языков программирования Параметризованные типы данных в языке 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; } } Концепции языков программирования