'

Разработка приложений на платформе .NET

Понравилась презентация – покажи это...





Слайд 0

Разработка приложений на платформе .NET Обобщения (шаблоны) Лекция 5


Слайд 1

Шаблоны, обобщения (Generics) Тип, метод или интерфейс параметризованный другим типом Обобщенный тип Тип (класс, структура), который параметризован другим типом class Queue<T> { } struct Complex<T> { } Обобщенная функция Функция, параметром которой является тип T Swap<T>(T x, T y) { } Обобщенный делегат Делегат, параметрами которого являются типы delegate T MyDelegate<T>() where T : new() Обобщенный интерфейс interface IEnumerable<T> { }


Слайд 2

Зачем нужны обобщения? Не типизированные коллекции Один код для всех Нет контроля типов, накладные расходы Коллекции с жёстко заданным типом Каждый раз новый код Контроль типов, нет накладных расходов Обобщенные коллекции Один код для всех Контроль типов, нет накладных расходов


Слайд 3

Синтаксис обобщенного типа [Модификаторы] class ИмяКласса<ОбозначенияТипов> [Ограничения типов] {…} ОбозначенияТипов := Обозначение1 [,ОбозначениеN] Ограничения типов := where ОбозначениeТипа1 : ограничения [, ОбозначениeТипаN : ограниченияN] Пример: public class Stack<T> where T : IDisposable, new() { T[] arr; T top = default(T); T example = new T(); Stack(int size) { arr = new T[size]; } void Push(T item) {…} T Pop() {return arr[i]; } void Dispose() {top.Dispose();} } Создание объекта обобщенного типа: Необходимо указать все типы-параметры Stack<int> myIntStack = new Stack<int>(); Dictionary<int, string> myDict = new Dictionary<int, string> ();


Слайд 4

Примеры Типов-параметров может быть много Обозначения типов –любые (допустимые) имена Обозначения типов могут использоваться в коде как обычный тип Для задания значения по умолчанию используется синтаксис Тип Переменная = default(Тип ); class MyDictionary<TKey, TValue> where TKey : Complex, IComparable where TValue : class { } struct MyGenericStruct<T> { } class MyGenericClass<A,B,C,B,E,F> { C c = dafault(C); }


Слайд 5

Синтаксис обобщенной функции [Модификаторы] ВозвращаемыйТип ИмяМетода<ОбозначенияТипов>(параметры) [Ограничения типов] { } Примеры: void Swap<T>(ref T a, ref T b) { T c = a; b = a; a = c; } public T Swap<T, U>(T a, U b, Complex<T> comp) {…} public T Copy<T>(T a, T b) where T : new() { T result = new T(); …..} Использование: При вызове необходимо задать все типы параметры, если компилятор не может определить их из контекста Swap<Complex>(ref comp1, ref comp2); int I = Swap<int, long>(intVariable, longVariable, myIntComplexVariable);


Слайд 6

Обобщенный интерфейс [Модификаторы] interface ИмяИнтерфейса<ОбозначенияТипов> [Ограничения типов] {…} Пример: public interface MyInterface<T, K> { T GetT(K k); K GerK(T t); T propertyT { get; } T propretyK { get; set; } bool Equal(T t, K k); } Использование: При реализации, либо класс должен быть обобщенным, либо должен реализовывать конкретный тип обобщенного интерфейса class MyClass<K, T> : MyInterface<T, K> { } class MyClass1<K> : MyInterface<int, K> { } class MyClass2 : MyInterface<int, string> { }


Слайд 7

Ограничения на параметры Типы-параметры: если что-то явно не оговорено, то этого НЕТ! По умолчанию доступны только методы object Если нужны дополнительные методы Необходимо использовать ограничения


Слайд 8

Типы ограничений Интерфейсы where T : ICloneable, IDisposable Базовый класс where T : MyBaseClass Ссылочные типы / Типы значения where T : struct where T : class Нельзя одновременно указать и class, и struct Наличие конструктора по умолчанию ограничение должно быть последним в списке where T : new()


Слайд 9

Ограничения ограничений Нельзя требовать наличие операции Дублируйте обычными методами Нельзя требовать конструктора с параметрами Если указано несколько ограничений Все должны выполняться одновременно Если нужна альтернатива – используйте базовые интерфейсы


Слайд 10

Демонстрации Обобщения и ограничения


Слайд 11

Задание Реализуйте Стек Стек должен быть обобщенным типом Методы void Push(T); T Pop(); T Top(); int Count(); В основном классе создайте обобщенный метод, создающий и заполняющий стек некоторым количеством объектов со значениями по умолчанию Создайте код для “тестирования” вашего стека Потребуйте от типа T, чтобы он реализовывал ICloneable и реализуйте T Top() так, чтобы он возвращал копию объекта, а не сам объект


×

HTML:





Ссылка: