Класс Instrument создавался для определения общего интерфейса всех производных классов. Этот интерфейс и определяет общность всех производных классов.
Абстрактный метод - метод который не имеет тела, есть только объявление.
abstract void f();
Класс с абстрактными методами – абстрактный класс.
abstract Instrument {…}
Класс, где есть хотя бы один абстрактный метод называется абстрактным.
В производном классе нужно переопределить все абстрактные методы, или он останется абстрактным. Создание экземпляров абстрактного класса запрещено, но можно делать upcasting к типу абстрактного класса. То есть можно описывать переменные абстрактного класса и присваивать им ссылки на неабстрактных потомков. При этом всегда применяется upcasting.
Например
Shape s = new Circle ();
Абстрактный класс –заготовка, часть методов реализовано, часть-нет.
abstract class Instrument {
private int i;
public abstract void play (Note n);
public String what () {
return “Instrument”;
}
public abstract void adjust();
}
class Wind extends Instrument {
public void play (Note n) {
System.out.println (“Wind.play () ” +n);
}
|
|
public String what () {return “Wind”;}
public void adjust () {}
}
class Percussion extends Instrument {
public void play (Note n) {
System.out.println (“Percussion.play () ” +n);
}
public String what (){return “Percussion”; }
public void adjust (){}
}
class Stringed extends Instrument {
public void play (Note n) {
System.out.println (“Stringed.play () ” +n);
}
public String what (){return “Stringed”; }
public void adjust (){}
}
class Brass extends Wind {
public void play (Note n) {
System.out.println (“Brass.play () ” +n);
}
public void adjust (){
System.out.println (“Brass.adjust()”);
}
}
class Woodwind extends Wind {
public void play (Note n){
System.out.println (“Woodwind.play() ” +n);
}
public String what () { return (“Woodwind”; }
}
public class Music4
static void tune (Instrument i) {
…
i.play (Note.MIDDLE_C);
}
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
Stringed.play () Middle C
Brass.play () Middle C
Woodwind.play Middle C