Универсальность. Классы с родовыми параметрами Под

Скачать презентацию Универсальность.  Классы с родовыми параметрами  Под Скачать презентацию Универсальность. Классы с родовыми параметрами Под

generic.ppt

  • Размер: 103.5 Кб
  • Количество слайдов: 17

Описание презентации Универсальность. Классы с родовыми параметрами Под по слайдам

Универсальность.  Классы с родовыми параметрами Универсальность. Классы с родовыми параметрами

Под универсальностью (genericity) понимается способность класса объявлять используемые им типы как параметры.  Класс с параметрами,Под универсальностью (genericity) понимается способность класса объявлять используемые им типы как параметры. Класс с параметрами, задающими типы, называется универсальным классом (generic class). Универсальными могут быть как классы, так и все их частные случаи — интерфейсы, структуры, делегаты, события. class My. Class {. . . }

Класс с универсальными методами class Change{ static public void SwapT(ref T x 1, ref T xКласс с универсальными методами 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. StackT{  abstract public T item(); abstract public void remove();Стек 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  T  :  Gen.Стек на односвязном списке 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. StackT : Gen. StackT{  int Size.Стек в виде массива 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. Stackint stack 1 = new One. Link. Stackint();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 является наследником некоторого класса и /или интерфейсов. Следовательно, над объектами типа T можно выполнять все операции, заданные базовым классом и интерфейсами. where T: Base. Class, I 1, . . . Ik. Ограничение конструктора. Это ограничение указывает, что тип T имеет конструктор без аргументов и, следовательно, позволяет создавать объекты типа T. where T: new(). Ограничение value/reference. Это ограничение указывает, к значимым или к ссылочным типам относится тип T. Для указания значимого типа задается слово struct , для ссылочных — class. where T: struct.

public class FatherT 1, T 2 { } public class Base{  public void M 1()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 NodeK, T where K: IComparableK {Пример: список с возможностью поиска элементов по ключу 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. ListK, T where K : IComparableK {  NodeK, T first, cursor;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){  NodeK, T temp = first; while (temp != null)  {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. Stackint;  public void Test.Родовое порождение класса. 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 PointT{  T x, y; //координаты точки }Частные виды классов Универсальные структуры 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);