В оркестр класса Music можно добавить новые типы, не изменяя метод tune (). Для этого метод должен оперировать интерфейсом базового класса- т.е.использовать только методы базового класса..
class Percussion extends Instrument {
void play (Note n) {System.out.println (“Percussion.play ()” + n); }
String what() {return “Percussion”;}
void adjust() {
print (“Adjusting Percussion”);}
}
class Stringed extends Instrument {
void play (Note n) {…}
}
class Brass extends Wind {
void play (Note n) {…}
}
class WoodWind extends Wind {
void play (Note n) {…}
}
____________________________________________________
public class Music 3 {
public static void tune(Instrument i) {
i.play(Note. MIDDLE_C);
}
public static void tuneAll (Instrument[] e) {
for (int i = 0; i<e.length; i++)
tune (e[i]);
}
public static void main (String [] args) {
Instrument [] orchestra = {
new Wind (),
new Percussion (),
new Stringed (),
new Brass (),
new WoodWind ()
};
tuneAll (orchestra);
}
}
Напечатается: Wind.play() Middle C
Percussion.play() Middle C......
Можем добавить новые методы и классы, не изменяя tune(). Метод изолирован от изменений в коде.
Полиморфизм позволяет отделить изменяемую часть от неизменяемой.