Similar presentations:
Обобщения (классы, методы). Интерфейсы. Примеры применения
1. Обобщения (классы, методы). Интерфейсы. Примеры применения
Лекция 42. Вопросы из предыдущей лекции
1. Интерфейс. Что можно объявит (реализовать)в интерфейсе.
2. Ограниечения для обобщенного класса:
– Ограничение конкретным классом и его
наследниками.
– Ограничения интерфейсом.
– Ограничение конструктором без параметров.
– Ограниение значимым типом.
– Ограничение ссылочным типом.
3. Синтаксис оформления ограничения
Ограничение интерфейсомclass Task<T> where T : Имя_Интерфейса{
….
}
Фактическим типом для параметра T может быть класс,
который поддерживает данный интрефейс
4. Синтаксис оформления ограничения
Ограничение классом и его наследниками(если такие есть )
class Task<T> where T : Имя_Класса{
….
}
Фактическим типом для параметра T может быть класс
или его наследники
5. Синтаксис оформления ограничения
Oграничение ссылочным типомclass Task<T> where T : class{
….
}
Фактическим типом для параметра T может быть только класс.
Task<double> D = new Task<double>(..);//error
Task<string> D = new Task<string>(..);
6. Синтаксис оформления ограничения
Oграничение значимым типомclass Task<T> where T : struct{
….
}
Фактическим типом для параметра T может быть только структура.
Task<double> D = new Task<double>(..);
Task<string> D = new Task<string>(..); //error
7. Синтаксис оформления ограничения
Oграничение конструктором без параметровclass Task<T> where T : new(){
….
}
C помощью слова new задаётся ограничение для типа T,
это может быть класс или структура, которые имеют
общедоступный конструктор без параметров.
8. Примеры использования ограничений
9. Oграничение конструктором без параметров
class Point{int x,y;
public Point(){x=y=0;}
public Point(int x, int y){this.x =x; this.y = y;}
public override string ToString() {
return string.Format("[Point X={0}, Y={1}]", x, y);
}
}
class Array<T> where T : new(){
T[] array;
public int N{set; get;}
public Array(int n){
N = n;
array = new T[N];
for (int i=0; i<N; i++)
array[i] = new T();
}
public T this[int i]{
set {array[i] = value;}
get {return array[i];}
}
public void print(){
Oграничение
конструктором
без параметров
public static void Main(string[] args)
{
Array<Point> Arr = new Array<Point>(3);
Arr[1] = new Point(4,-2);
Arr.print();
}
for (int i=0; i<N; i++)
Console.WriteLine(array[i].ToString()); } }
10. Порядок ограничений
Если для универсального параметра заданонесколько ограничений, то они должны идти
в определенном порядке:
1. Название класса, class, struct. Можно
одновременно определить только одно из
этих ограничений
2. Название интерфейса
3. new()
11. Порядок ограничений. Пример.
interface IPrint{void print();
void move();
}
class Person: IPrint{
public string Name { get; set; }
public void print(){…}
public void move(){…}
public Person(){…}
}
class Task<T> where T: Person, IPrint, new(){
public T autor;
public Task(){
autor = new T();
autor.move();
autor.Name …
…
}…}
12. Порядок ограничений
Если класс использует несколько универсальныхпараметров, то последовательно можно задать
ограничения к каждому из них.
class Task<U, V> where U : Person
where V : class, new()
{
}
13. Разные формальные параметры
public class Food<T1>{public void new_method<T2>(T2 Value){
….}
…
}
public class Food<T>{
public void new_method(T Value){
….}
…
}
14. Пример. Разные формальные параметры.
15. Пример. Одинаковый формальный параметр.
16. Разрастание кода
Конкретизация (reification) – создание классапутем задания в обобщенном классе
конкретных типов вместо неопределенных
типов-параметров.