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