Универсальность. Классы с родовыми параметрами Под
- Размер: 103.5 Кб
- Количество слайдов: 17
Описание презентации Универсальность. Классы с родовыми параметрами Под по слайдам
Универсальность. Классы с родовыми параметрами
Под универсальностью (genericity) понимается способность класса объявлять используемые им типы как параметры. Класс с параметрами, задающими типы, называется универсальным классом (generic class). Универсальными могут быть как классы, так и все их частные случаи — интерфейсы, структуры, делегаты, события. class My. Class {. . . }
Класс с универсальными методами class Change{ static public void Swap(ref T x 1, ref T x 2) { T temp; temp = x 1; x 1 = x 2; x 2 = temp; } } public void Test. Swap(){ int x 1 = 5, x 2 = 7; Change. Swap(ref x 1, ref x 2); string s 1 = » Саша «, s 2 = » Павел «; Change. Swap(ref s 1, ref s 2); Person pers 1 = new Person(» Савлов «, 25, 1500); Person pers 2 = new Person(» Павлов «, 35, 2100); Change. Swap(ref pers 1, ref pers 2); }
Два основных механизма объектной технологии Наследование позволяет специализировать операции класса, уточнить, как должны выполняться операции. Универсализация позволяет специализировать данные, уточнить, над какими данными выполняются операции.
Этап проектирования (спецификации): абстрактный класс с абстрактными типами Наследование: уточняется представление данных; задается или уточняется реализация методов родителя
Родовое порождение: уточняются типы данных; порождается класс путем подстановки конкретных типов
Стек abstract public class Gen. Stack{ abstract public T item(); abstract public void remove(); abstract public void put(T t); abstract public bool empty(); }
Стек на односвязном списке public class One. Link. Stack : Gen. Stack { public One. Link. Stack () { top = null ; } Gen. Linkable top ; //ссылка на вершину стека public override T item() { return (top. Item); } public override bool empty() { return (top == null); } public override void put(T elem) { Gen. Linkable newitem = new Gen. Linkable(); newitem. Item = elem; newitem. Next = top; top = newitem; } public override void remove() {top = top. Next; } } public class Gen. Linkable{ public T Item; public Gen. Linkable Next; public Gen. Linkable() { Item = default(T) ; Next = null; } }
Стек в виде массива public class Array. Up. Stack : Gen. Stack{ int Size. Of. Stack; T[] stack; int top; public Array. Up. Stack(int size) { Size. Of. Stack = size; stack = new T[Size. Of. Stack]; top = 0; } public override void put(T x) { stack[top] = x; top++; } public override void remove() { top—; } public override T item() { return (stack[top-1]); } public override bool empty() { return (top == 0); } }
public void Test. Person() { One. Link. Stack stack 1 = new One. Link. Stack(); One. Link. Stack stack 2 = new One. Link. Stack(); Array. Up. Stack stack 3 = new Array. Up. Stack (10); Array. Up. Stack stack 4 = new Array. Up. Stack(7); . . . }
Ограниченная универсальность Ограничение наследования. Это основный вид ограничений, указывающий, что тип T является наследником некоторого класса и /или интерфейсов. Следовательно, над объектами типа T можно выполнять все операции, заданные базовым классом и интерфейсами. where T: Base. Class, I 1, . . . Ik. Ограничение конструктора. Это ограничение указывает, что тип T имеет конструктор без аргументов и, следовательно, позволяет создавать объекты типа T. where T: new(). Ограничение value/reference. Это ограничение указывает, к значимым или к ссылочным типам относится тип T. Для указания значимого типа задается слово struct , для ссылочных — class. where T: struct.
public class Father { } public class Base{ public void M 1() { } public void M 2() { } } public class Child : Father where T 1: Base, IEnumerable, new() where T 2: struct, IComparable { }
Пример: список с возможностью поиска элементов по ключу class Node where K: IComparable { public Node() { next = null; key = default(K); item = default(T); } public K key; public T item; public Node next; }
public class One. Link. List where K : IComparable { Node first, cursor; public void start() { cursor = first; } public void finish(){ while (cursor. next != null) cursor = cursor. next; } public void forth(){ if (cursor. next != null) cursor = cursor. next; } public void add(K key, T item){ Node newnode = new Node(); newnode. key = key; newnode. item = item; if (first == null) { first = cursor= newnode; } else { newnode. next = cursor. next; cursor. next = newnode; } }
public bool findstart(K key){ Node temp = first; while (temp != null) { if (temp. key. Compare. To(key) == 0) { cursor=temp; return(true); } temp= temp. next; } return (false); } public void Test. Constraint(){ One. Link. List list 1 = new One. Link. List (); One. Link. List list 2 = new One. Link. List (); … }
Родовое порождение класса. using Int. Stack = Generic. One. Link. Stack; public void Test. Int. Stack(){ Int. Stack stack 1 = new Int. Stack(); Int. Stack stack 2 = new Int. Stack(); Int. Stack stack 3 = new Int. Stack(); . . . }
Частные виды классов Универсальные структуры public struct Point{ T x, y; //координаты точки } Универсальные интерфейсы IComparable Универсальные делегаты class With. Delegate{ public delegate T Del(T a, T b); — объявление делегата. . . } With. Delegate . Del del 1; del 1 = new With. Delegate . Del(Program. max 2); либо del 1= this. max 2; Функциональный тип-делегат с родовыми праметрами public delegate T Fun. Two. Arg(T a, T b);