Добавил:
Rumpelstilzchen2018@yandex.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3-й семестр / Лекции / 8 - Презентация

.pdf
Скачиваний:
57
Добавлен:
25.12.2020
Размер:
10.74 Mб
Скачать

Центрдистанционногообучения

Пример

class Crossover {}

class Garage {

private Crossover parkedAuto;

public Garage(Crossover parkedAuto) { this.parkedAuto = parkedAuto;

}

public Crossover getParkedAuto(){ return parkedAuto;}

}

class Man {

public static void main(String[] args) {

Garage garage = new Garage (new Crossover());

}

}

21 online.mirea.ru

Центрдистанционногообучения

Проблемы

• Обычные классы и методы работаю с конкретными типами (примитивы или классы)

• Что делать, если нужно работать с разнообразными типами?

• Не писать же один и тот же код для каждого возможного типа…

22 online.mirea.ru

Центрдистанционногообучения

Пример иерархии типов

class Auto {}

 

А как же хэтчбэк?

class

Crossover extends Auto{}

class

Hatchback extends Auto{}

 

 

class Garage {

private Auto parkedAuto;

public Garage(Auto parkedAuto) { //конструктор this.parkedAuto = parkedAuto;

}

public Auto getParkedAuto(){ return parkedAuto;}

}

 

 

class Main {

 

 

public static void main(String[] args) {

 

 

Garage garage = new Garage (new Crossover());

 

 

Garage anotherGarage = new Garage (new Hatchback());

 

}

}

 

23

online.mirea.ru

 

 

Центрдистанционногообучения

Увеличение гибкости за счет наследования

Код работает с объектами по ссылке на базовый тип.

Этот код может быть использован для работы с производными типами.

Достигаемая гибкость работает только в пределах одной иерархии (наследования)

24 online.mirea.ru

Центрдистанционногообучения

А как же прицеп?

interface Wheeled{} //общийинтерфейс class Crossover implements Wheeled{}

class

Hatchback

implements

Wheeled{}

class

Trailer

implements

Wheeled{}

class Garage {

private Wheeled parkedThing;

public Garage(Wheeled parkedThing){this.parkedThing = parkedThing;} public Wheeled getParkedThing(){ return parkedThing;}

}

class Main {

public static void main(String[] args) {

Garage garage = new Garage (new Crossover()); Garage anotherGarage = new Garage (new Trailer());

}

}

25 online.mirea.ru

Центрдистанционногообучения

Увеличение гибкости за счет интерфейсов

Преимущества:

Код работает с объектами по интерфейсной ссылке

Этот код может быть использован для работы с любыми объектами, реализующими этот интерфейс

Более гибкий механизм (по сравнению с наследованием), но требует реализации интерфейса

26 online.mirea.ru

 

Центрдистанционногообучения

А как же мешок картошки в гараже?

 

interface Wheeled{}

class Crossover implements Wheeled{}

class Hatchback

implements Wheeled{}

class Trailer

implements Wheeled{}

class PotatoesBag {};

class Garage {

 

private Object keepingThing;

public Garage(Object keepingThing){

this.keepingThing = keepingThing;

}

 

public

Object getKeepingThing(){ return keepingThing; }

 

}

{

 

class Man

 

public

static void main(String[] args) {

 

Garage garage = new Garage (new PotatoesBag());

 

Object o = garage.getKeepingThing();

 

PotatoesBag bag;

 

if

(o instanceof PotatoesBag) bag = (PotatoesBag) o;

}

27

 

}

online.mirea.ru

 

 

Центрдистанционногообучения

Обобщения (generics)

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

Используются, когда один и тот же код применим к большому числу типов

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

В основном используются контейнерами

Всеинтерфейсыкласколлекцийделали параметризированными

28 online.mirea.ru

Центрдистанционногообучения

Занесем в гараж мешок с картошкой J

interface Wheeled{}

class Crossover implements Wheeled{}

class Hatchback

implements Wheeled{}

class

Trailer

implements Wheeled{}

class

PotatoesBag {};

class Garage<T> {

private T keepingThing;

public Garage(T keepingThing){ this.keepingThing = keepingThing; } public T getKeepingThing(){ return keepingThing; }

}

class Man {

public static void main(String[] args) {

 

Garage<Wheeled> garage = new Garage<Wheeled> (new Crossover());

 

Garage<PotatoesSack> anotherGarage =

 

new Garage<PotatoesBag> (new PotatoesBag());

 

PotatoesBag bag = anotherGarage.getKeepingThing();

}

}

29 online.mirea.ru

Центрдистанционногообучения

Обобщения (generics)

Код работает только с тем типом, который указан в угловых скобках

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

Обеспечиваютавтоматическуюпроверку приведениетипов

Позволяют создавать хороший повторно используемый код

30 online.mirea.ru