2 回答
TA贡献1765条经验 获得超5个赞
这只是围绕面向对象设计的一些基本思想。如果没有更具体的信息,就很难就设计类或接口做出明确的决定。
继承、行为和属性主要影响设计。设计的方式还取决于大小(数量、类型和种类 - 请记住)。可以看看 Java 语言本身的继承设计,例如集合——Collection接口和Map接口及其实现。
以下是一些即时的想法:
public interface Bird {
public void eat();
public void layEggs();
}
// Provides implementations for _some_ abstract methods and _no_ new methods.
// Also, some implementations can just be empty methods.
public abstract class AbstractBird implements Bird {
public void eat() {
// generic eating implementation
}
public abstract void layEggs(); // no implementation at all
}
// Specific to ground-oriented with Bird behaviour
public interface GroundBird extends Bird {
public void walk();
}
// Specific to air-oriented with Bird behavior
public interface FlyBird extends Bird {
public void fly();
}
// Ground-oriented with _some_ bird implementation
public class Penguin extends AbstractBird implements GroundBird {
public void walk() {
}
public void layEggs() {
// lays eggs on ground
}
// Can override eat if necessary
}
// Air-oriented with _all_ bird implementation
public class Eagle implements FlyBird {
public void fly() {
}
public void layEggs() {
// lays eggs on trees
}
public void eat() {
// can eat while flying
}
}
这种设计将允许:
提供更多的方法,例如pluck()在Bird后来接口,只在有执行AbstractBird。
也有一些类别的类可以跳过AbstractBird完全和直接实现Bird接口的更具体的实施方式eat和layEggs。这也允许一个新的鸟类扩展一个新的类或抽象类。
WaterBirds稍后添加其他类型的鸟,例如*。
*
public interface WaterBird {
public void swim();
}
public class Duck implements WaterBird, GroundBird {
public void swim() {
}
public void walk() {
}
public void eat() {
}
public void layEggs() {
// lays eggs on ground
}
}
并且可以Diveable为可以潜入水中捕鱼Glideable的鸟类以及可以翱翔和滑翔的鸟类创建新的界面。可以看到的Glideable是飞鸟的一种特殊行为。另请注意,这Glidable也是HangGlider 的一种行为,由鸟类和飞机共享。
public interface Glideable {
public void glide();
}
public class Eagle extends AbstractBird implements FlyBird, Glideable {
public void fly() {
}
public void glide() {
// eagle specific
}
public void layEggs() {
// lays eggs on trees
}
// Can override eat if necessary
}
注意:从 Java 8 开始,可以考虑在接口中使用静态和默认方法。
添加回答
举报