续《JAVA编程思想》学习备忘(第237页:Reusing Classes)-2
Combining composition and inheritance
It is very common to use composition and inheritance together.The following example shows the creation of a more complex class,using both inheritance and composition,along with the necessary constructor initialization:
//:reusing/PlaceSetting.java
//Combining composition & inheritance.
import static net.mindview.util.Print.*;
class Plate{
Plate(int i){
print("Plate constructor");
}
}
class DinnerPlate extends Plate{
DinnerPlate(int i){
super(i);
print("DinnerPlate constructor");
}
}
class Utenstil{
Utensil(int i){
print("Utensil constructor");
}
}
class Spoon extends Utensil{
Spoon(int i){
super(i);
print("Spoon constructor");
}
}
class Fork extends Utensil{
Fork(int i){
super(i);
print("Fork constructor");
}
}
class knife extends Utensil{
knife(int i){
super(i);
print("knife constructor");
}
}
//A cultural way of doing something:
class Custom{
Custom(int i){
print("Custom constructor");
}
}
public class PlaceSetting extends Custom{
private Spoon sp;
private Fork frk;
private knife kn;
private DinnerPlate pl;
public PlaceSetting(int i){
super(i + 1);
sp = new Spoon(i + 2);
frk = new Fork(i + 3);
kn = new knife(i + 4);
pl = new DinnerPlate(i + 5);
print("PlaceSetting constructor");
}
public static void main(String[] args){
PlaceSetting x = new PlaceSetting(9);
}
}
输出结果:
Custom constructor
Utensil constructor
Spoon constructor
Utensil constructor
Fork constructor
Utensil constructor
kinfe constructor
Plate constructor
DinnerPlate constructor
PlaceSetting constructor
It's rather amazing how cleanly the classes are separated.You don't even need the source code for the methods in order to reuse the code.At most,you just import a package.
Guaranteeing proper cleanup
Consider an example of a computer-aided design system that draws pictures on the screen:
//:reusing/CADSystem.java
//Ensuring proper cleanup.
package reusing;
import static net.mindview.util.Print.*;
class Shape{
Shape(int i){print("Shape constructor");}
void dispose(){print("Shape dispose");}
}
class Circle extends Shape{
Circle(int i){
super(i);
print("Drawing Circle");
}
void dispose(){
print("Erasing Circle");
super.dispose();
}
}
class Triangle extends Shape{
Triangle(int i){
super(i);
print("Drawing Triangle");
}
void dispose(){
print("Erasing Triangle");
super.dispose();
}
}
class Line extends Shape{
private int start,end;
Line(int start,int end){
super(start);
this.start = start;
this.end = end;
print("Drawing Line: " + start + ", " + end);
}
void dispose(){
print("Erasing Line: " + start + ", " + end);
super.dispose();
}
}
public class CADSystem extends Shape{
private Circle c;
private Triangle t;
private Line[] lines = new Line[3];
public CADSystem(int i){
super(i + 1);
for(int j = 0; j < lines.length; j++)
lines[j] = new Line(j,j*j);
c = new Circle(1);
t = new Triangle(1);
print("Combined constructor");
}
public void dispose(){
print("CADSystem.dispose()");
// The order of cleanup is the reverse
// of the order of initialization:
t.dispose();
c.dispose();
for(int i = lines.length - 1; i >= 0; i--)
lines[i].dispose();
super.dispose();
}
public static void main(String[] args){
CADSystem x = new CADSystem(47);
try{
// Code and exception handling...
}finally{
x.dispose();
}
}
}
输出结果:
Shape constructor
Shape constructor
Drawing Line: 0, 0
Shape constructor
Drawing Line: 1, 1
Shape constructor
Drawing Line: 2, 4
Shape constructor
Drawing Circle
Shape constructor
Drawing Triangle
Combined constructor
CADSystem.dispose()
Erasing Triangle
Shape dispose
Erasing Circle
Shape dispose
Erasing Line: 2, 4
Shape dispose
Erasing Line: 1, 1
Shape dispose
Erasing Line: 0, 0
Shape dispose
Shape dispose
(代续)