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()
    。一种方法很简单,但如果
    Vehicle
    有100种方法,我就有问题了。。。我的第一个想法是,无论是
    Runner
    还是
    Flying
    都不应该从
    Vehicle
    扩展,但我将失去语义关系
我的问题是:

  • 实现接口是一种很好的做法,就像我在类
    FlyingCar
    中使用的
    runnerplementation
    FlyingImplementation
    中所做的那样
  • 有没有更好的方法来实现这一点

TIA,

我只想让
FLyingCar
实现
Flying
Runner
,因为它也将实现
Vehicle
(两个接口都扩展了它)。我不认为实现接口只是为了将实现用作其他类的基类有什么意义(除非有大量不同的对象类型)。

我们怎么知道?这取决于你想做什么。我建议你转移到我唯一的建议是关于命名约定。“Flying”是接口名称的错误选择。通常,接口名称意味着某些对象类型可能显示的某种质量,而其他相关对象可能不显示。“Flyable”是一种更“正确”的接口命名约定。此外,“飞行”是一个动词,动词暗示动作。方法表示类或接口的行为(操作)。因此,“飞行”更适合于方法,而不是类或接口。@OldCurmudgeon感谢您的建议。我是新来的。我将在那个论坛上提问。这个问题太抽象,无法决定这是否是一个好的设计。设计是由需求驱动的,它不是一个独立的过程。如果没有需求,就无法衡量接口满足需求的程度。您实际上是从错误的一端解决了这个问题,但是当我们谈论多重继承时,我在另一个答案中看到了这样的例子。这就是我这样做的原因……如果你知道你将有几个Car对象,那么一些方法的实现可能是相同的,在这种情况下,有一个具体(或抽象)的Car对象作为更具体的Car的基类是有意义的。您的示例目前并不需要它。我犯的一个错误是编写了一个过于抽象的示例,而没有像@Durandal所说的那样讨论需求。这让我的问题变得毫无用处。不管怎样,想想我要做的,是的,你说得对。非常感谢。