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

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

.pdf
Скачиваний:
59
Добавлен:
25.12.2020
Размер:
596.48 Кб
Скачать

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

Интерфейсы

public interface CanFly { int getWingsCount(); } public interface CanTalk { String getWord(); } public class Duck implements CanFly, CanTalk {

@Override // реализация CanFly public int getWingsCount() { return 2; } @Override // реализация CanTalk public String getWord() { return “Кря”; }

}

online.mirea.ru

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

Интерфейсы

Интерфейсы выступают в роли спецификации, которой должны следовать реализующие их классы.

Если у вас определен интерфейс, описывающий взаимодействие двух программных модулей, то их можно реализовывать, не полагаясь на конкретную реализацию интерфейса:

https://en.wikipedia.org/wiki/Interface_(computing)#Programming_to_the_interface

online.mirea.ru

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

Интерфейсы

public interface Protocol { ... }

public class ModuleA {

private Protocol p;

}

public class ModuleB implements Protocol { ... }

Нет явной зависимости между модулями A и B

online.mirea.ru

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

Интерфейсы

Интерфейсы также могут наследоваться друг от друга (но не от классов):

public interface HasArea {

double getArea();

}

public interface HasCoordinates {

double getX();

double getY();

}

public interface Shape extends HasArea, HasCoordinates {

}

online.mirea.ru

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

Интерфейсы

Почему для интерфейсов возможно множественное наследование, а для классов нет?

Ромбовидное наследование (diamond problem)

online.mirea.ru

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

Интерфейсы

public abstract class Animal {

public String talk() { return “”; }

}

public class Dog extends Animal {

@Override

public String talk() { return “Гав”; }

}

public class Cat extends Animal {

@Override

public String talk() { return “Мяу”; }

}

online.mirea.ru

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

Интерфейсы

//Гипотетическое множественное наследование

//(невозможно в Java):

public class Hybrid extends Dog, Cat {

// Наследует метод talk от предков

}

Hybrid zver = new Hybrid(); System.out.println(zver.talk()); // Что будет выведено?

online.mirea.ru

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

Интерфейсы

Animal

Dog

 

Cat

 

 

 

Hybrid

Ромбовидное наследование

online.mirea.ru

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

Интерфейсы

Так как в Java возможно только множественная реализация интерфейсов, то Dog и Cat должны быть интерфейсами (соответственно Animal – тоже интерфейс):

public interface Animal { String talk(); }

public interface Cat extends Animal {

@Override String talk(); // Тот же метод, что и в Animal – нет реализации!

}

public interface Dog extends Animal {

@Override String talk(); // Тот же метод, что и в Animal – нет реализации!

}

online.mirea.ru

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

Интерфейсы

public class Hybrid implements Dog, Cat {

@Override

public String talk() {

return “ГмАяВу”; // Мы обязаны определить метод здесь

}

}

Hybrid zver = new Hybrid();

//Единственная реализация метода – в классе Hybrid:

System.out.println(zver.talk());

//Нет проблемы ромбовидного наследования

online.mirea.ru