'

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

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





Слайд 0

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


Слайд 1

Сегодня Интерфейсы Обобщения


Слайд 2

Сегодня Интерфейсы Обобщения


Слайд 3

Интерфейсы Интерфейс - контракт, поведение, которое реализующий класс обязуется поддерживать. Набор семантически связанных абстрактных членов. Интерфейс определяет спецификацию, но не определяет реализацию Класс – наследуют, а интерфейс – реализуют


Слайд 4

Объявление интерфейса Объявление интерфейса [attributes] [modifiers] interface interface_name [: base_interfaces] { interface_body } Пример объявления интерфейса public interface IDisposable { void Dispose(); } public interface IPointy { byte Points {get;} int GetNumberOfPoints(); }


Слайд 5

Члены интерфейса Интерфейс может содержать следующие члены Методы Свойства Индексаторы События Не могут содержать поля Не могут содержать реализацию Члены интерфейса не могут быть статическими Члены интерфейса не могут иметь модификаторов Члены интерфейса всегда public


Слайд 6

Реализация интерфейса Классы и структуры могут реализовать интерфейсы public class Circle2d : Ellipse2d, ICloneable Базовый класс должен идти первым в списке, а за ним список реализуемых интерфейсов. Можно реализовать одновременно несколько интерфейсов Класс, реализующий интерфейс: Либо реализует все его методы Либо объявляет их (и себя) абстрактными


Слайд 7

Явная и неявная реализация Неявная реализация интерфейса Записывается короткое имя каждого метода public object Clone() { … } Метод доступен как обычно peremen.Clone() Метод доступен и через интерфейс ((ICloneable)peremen).Clone() Явная (explicit) реализация интерфейса Записывается квалифицированное имя каждого метода object ICloneable.Clone() { … } Метод доступен только через интерфейс ((ICloneable)peremen).Clone() Используется при наличии конфликта Не указывается модификатор доступа. Он неявно public


Слайд 8

Привязка методов интерфейса Привязка к не виртуальным методам Производному классу, чтобы сменить реализацию, требуется самому реализовать интерфейс Привязка к виртуальным методам Производным классам достаточно просто переопределить виртуальный метод, чтобы сменить реализацию


Слайд 9

Об интерфейсах Интерфейсы могут наследоваться от других интерфейсов. Производный интерфейс включает в себя все из базовых интерфейсов Тип (класс, структура), реализующие производный интерфейс должен реализовать также и все базовые интерфейсы public interface IDrawable : IPrintable {} Передача интерфейсов в качестве параметров Метод принимает любой тип, реализующий данный интерфейс public void GetShape(IDrawable shape); Интерфейсы в качестве возвращаемых параметров Метод возвращает некий тип, который реализует данный интерфейс public IDrawable GetShape(); В .NET все существующие интерфейсы начинаются с I


Слайд 10

Абстрактные классы и интерфейсы Абстрактные классы и интерфейсы обеспечивают абстракцию Абстрактные классы могут содержать реализацию, интерфейсы – нет Интерфейсы могут содержать только методы, свойства, события и индексаторы Все члены интерфейса – public. Это открытый контракт Используйте абстрактные классы, если: Требуется определить определенную функциональность, которую могут использовать все наследники Производный класс “является” базовым Используйте интерфейсы Производный класс “реализует” интерфейс Требуется множественное наследование


Слайд 11

Примеры интерфейсов ICloneable Определяет единственный метод object Clone() Позволяет выполнять копирование объектов IDisposable Определяет единственный метод Dispose() Реализуйте этот метод, если требуется освобождение внешних ресурсов Файлы, соединения и т.д. IComparable – используется при сортировках при сравнении 2 элементов IEnumerable, IEnumerable<T>, IEnumerator, IEnumerator<T> Позволяют итерировать по коллекции IDictionary<TKey, TValue>, IList<T>, ICollection<T> Интерфейсы реализуемые коллекциями


Слайд 12

Демонстрации Интерфейсы


Слайд 13

Задание Реализуйте абстрактный класс Shape, содержащий метод Draw(), якобы рисующий фигуру (вывод строки на экран) Создайте классы его потомков Triangle, Hexagon, Circle, Sphere Создайте интерфейсы IPoint, со свойством Point, выдающим количество точек в фигуре. IDrawable, с методом Draw(), якобы рисующем фигуру (вывод строки на экран ) Реализуйте IPoint для Triangle и Hexagon IDrawable для Triangle (не явно) и Sphere (явно) В основном классе: Создайте метод AnalyzeShape(), принимающий Shape и распечатывающий, если возможно, кол-во точек в фигуре, и вызывающий метод Draw напрямую и через интерфейс. В методе Main создайте массив из Shape с разными фигурами и проанализируйте их вызвав метод AnalyzeShape()


Слайд 14

Сегодня Интерфейсы Обобщения


Слайд 15

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


Слайд 16

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


Слайд 17

Синтаксис обобщенного типа [Модификаторы] 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> ();


Слайд 18

Примеры Типов-параметров может быть много Обозначения типов –любые (допустимые) имена Обозначения типов могут использоваться в коде как обычный тип Для задания значения по умолчанию используется синтаксис Тип Переменная = 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); }


Слайд 19

Синтаксис обобщенной функции [Модификаторы] ВозвращаемыйТип ИмяМетода<ОбозначенияТипов>(параметры) [Ограничения типов] { } Примеры: 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);


Слайд 20

Обобщенный интерфейс [Модификаторы] 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> { }


Слайд 21

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


Слайд 22

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


Слайд 23

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


Слайд 24

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


Слайд 25

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


×

HTML:





Ссылка: