Java 这是一个很好的接口实现吗?
我问了一个关于使用接口的最佳实践的问题。请看下面的代码: 这些是接口:Java 这是一个很好的接口实现吗?,java,inheritance,interface,composition,Java,Inheritance,Interface,Composition,我问了一个关于使用接口的最佳实践的问题。请看下面的代码: 这些是接口: public interface Vehicle { public int getAcceleration(); } public interface Flying extends Vehicle { public int getAltitude(); public void up(int seconds); public void down(int seconds); } public
public interface Vehicle {
public int getAcceleration();
}
public interface Flying extends Vehicle {
public int getAltitude();
public void up(int seconds);
public void down(int seconds);
}
public interface Runner extends Vehicle {
public int getSpeed();
public void accelerate(int seconds);
public void decelerate(int seconds);
}
这将是接口运行程序的实现:
public class RunnerImplementation implements Runner {
Vehicle vehicle;
int speed;
public RunnerImplementation(Vehicle v) {
vehicle = v;
}
@Override
public int getAcceleration() {
return vehicle.getAcceleration();
}
@Override
public int getSpeed() {
return speed;
}
@Override
public void accelerate(int seconds) {
speed += seconds * getAcceleration();
}
@Override
public void decelerate(int seconds) {
speed -= seconds * getAcceleration();
}
}
这将是接口飞行的实现:
public class FlyingImplementation implements Flying {
Vehicle vehicle;
int altitude;
public FlyingImplementation(Vehicle v) {
vehicle = v;
}
@Override
public int getAcceleration() {
return vehicle.getAcceleration();
}
@Override
public int getAltitude() {
return altitude;
}
@Override
public void up(int seconds) {
altitude += seconds * getAcceleration();
}
@Override
public void down(int seconds) {
altitude -= seconds * getAcceleration();
}
}
这就是飞行汽车的结果:
public class FlyingCar extends BaseVehicle implements Flying, Runner {
Flying flying = null;
Runner runner = null;
public FlyingCar() {
flying = new FlyingImplementation(this);
runner = new RunnerImplementation(this);
}
@Override
public int getSpeed() {
return runner.getSpeed();
}
@Override
public void accelerate(int seconds) {
runner.accelerate(seconds);
}
@Override
public void decelerate(int seconds) {
runner.decelerate(seconds);
}
@Override
public int getAltitude() {
return flying.getAltitude();
}
@Override
public void up(int seconds) {
flying.up(seconds);
}
@Override
public void down(int seconds) {
flying.down(seconds);
}
}
如你所见:
- 我实现了每个接口,创建了类
和runnerplementation
李>FlyingImplementation
- 每个实现都需要知道当前对象才能知道其加速度,我将一个
对象作为参数传递给构造函数车辆
- 我将
和Runner
定义为Flying
的扩展,因为我想表明它们在语义上是相关的,但这迫使我实现两次方法Vehicle
。一种方法很简单,但如果getAcceleration()
有100种方法,我就有问题了。。。我的第一个想法是,无论是Vehicle
还是Runner
都不应该从Flying
扩展,但我将失去语义关系Vehicle
- 实现接口是一种很好的做法,就像我在类
中使用的FlyingCar
和runnerplementation
中所做的那样李>FlyingImplementation
- 有没有更好的方法来实现这一点李>
TIA,我只想让
FLyingCar
实现Flying
和Runner
,因为它也将实现Vehicle
(两个接口都扩展了它)。我不认为实现接口只是为了将实现用作其他类的基类有什么意义(除非有大量不同的对象类型)。我们怎么知道?这取决于你想做什么。我建议你转移到我唯一的建议是关于命名约定。“Flying”是接口名称的错误选择。通常,接口名称意味着某些对象类型可能显示的某种质量,而其他相关对象可能不显示。“Flyable”是一种更“正确”的接口命名约定。此外,“飞行”是一个动词,动词暗示动作。方法表示类或接口的行为(操作)。因此,“飞行”更适合于方法,而不是类或接口。@OldCurmudgeon感谢您的建议。我是新来的。我将在那个论坛上提问。这个问题太抽象,无法决定这是否是一个好的设计。设计是由需求驱动的,它不是一个独立的过程。如果没有需求,就无法衡量接口满足需求的程度。您实际上是从错误的一端解决了这个问题,但是当我们谈论多重继承时,我在另一个答案中看到了这样的例子。这就是我这样做的原因……如果你知道你将有几个Car对象,那么一些方法的实现可能是相同的,在这种情况下,有一个具体(或抽象)的Car对象作为更具体的Car的基类是有意义的。您的示例目前并不需要它。我犯的一个错误是编写了一个过于抽象的示例,而没有像@Durandal所说的那样讨论需求。这让我的问题变得毫无用处。不管怎样,想想我要做的,是的,你说得对。非常感谢。