3-й семестр / Лекции / 8 - Презентация
.pdfЦентрдистанционногообучения
Пример
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