Предыдущее занятие | Следущее занятие |
Новое на этом занятии:
Не так давно, на занятии посвященном наследованию мы с вами говорили, что именно оно (наследование) делает язык Java объектно-ориентированным. Это не до конца является правдой, т.к. кроме наследования важной чертой объектно-ориентированного программирования (ООП) является ПОЛИМОРФИЗМ.
(ПОЛИМОРФНЫЙ — греч., от polys многий, и morphe вид. Многовидный, многоформенный, многообразный. Словарь иностранных слов, вошедших в состав русского языка. Чудинов А.Н., 1910.). |
Полиморфизм в языках программирования позволяет определять функцию (метод) или тип данных обобщенно, так что информация обрабатывается идентично, вне зависимости от типа объектов (подробнее см., например, Википедию). Поясним это на примере (взятом из [1]), и знания, полученные на прошлом занятии, посвященном изучению интерфейсов нам обязательно помогут!
Листинг 1. Файл Chorus.java - хор "Поющие животные"
class Dog implements VoiceBehavior {
public void voice () {
System.out.println("gav-gav!");
}
}
class Cat implements VoiceBehavior {
public void voice () {
System.out.println("myau!");
}
}
class Cow implements VoiceBehavior {
public void voice () {
System.out.println("muu!");
}
}
public class Chorus {
public static void main (String [] args) {
VoiceBehavior [] vb = new VoiceBehavior[3];
vb[0] = new Dog();
vb[1] = new Cat();
vb[2] = new Cow();
for (VoiceBehavior v : vb) {
v.voice();
}
}
}
Программа состоит из определения трех классов животных, которые умеют издавать звуки - собаки, кота и коровы. Метод, издающий звук, предусмотрительно определен в интерфейсе VoiceBehavior (англ. "поведение голоса") и реализован в классах Dog, Cat, Cow, которые и наследуют "поведение" от интерфейса VoiceBehavior. Как определяется интерфейс, почему необходимо методы, унаследованные от интерфейса определять как public читайте в материалах прошлого занятия.
Понятно, что каждое животное издает звуки, приличные своему виду (для этого использован свой метод System.out.println() в каждом классе). Но самое интересное в программе - это использование интерфейса для выполнения метода voice() всеми животными. Для этого создан массив объектов VoiceBehavior, и с помощью оператора new в массив добавлены экземпляры классов Dog, Cat, Cow.
Новым в нашей программе является еще и использование оператора цикла с, так называемым, синтаксисом "foreach":
Означает такая запись следующее: для каждого объекта типа VoiceBehavior выполнить метод voice(). Полиморфизм в данном случае проявляется в возможности преобразования типа объекта Dog, Cat, Cow к типу VoiceBehavior (напомним, что все эти классы при их определении наследовали от интерфейса VoiceBehavior).
Вот так, применив полиморфизм в данном примере, мы получили компактную и легко читаемую программу!
В заключении нужно добавить, что для ООП на языке Java понятие интерфейса (interface), вместе с понятием класса, играет существенную роль, для более подробного ознакомления с применением интерфейсов можно порекомендовать не раз приводимую книгу Б.Эккеля "Философия Java" [2]. В примере же, приведенном на прошлом занятии, интерфейсы были использованы только лишь для того, чтобы мы не забыли реализовать некоторые методы для нашего класса. Нам же понятие интерфейса понадобится, чтобы приступить к изучению программирования для ОС Android.
Задание:
* попробуйте в одном из классов "забыть" реализовать метод voice(). (После каждого изменения исходного кода программу нужно перекомпилировать). Проанализируйте полученный результат.
Предыдущее занятие | Следущее занятие |
Комментарии
Si La
чт, 03/02/2017 - 09:48
Постоянная ссылка (Permalink)
Взгляд со стороны
Ну что же, полгода спустя как написал, читается неплохо! Надо бы интерактивности побольше!
Страницы