具有多个具有不同签名的实现类的java接口

具有多个具有不同签名的实现类的java接口,java,interface,implements,Java,Interface,Implements,我正在创建一个界面,上面写着“Car” public interface Car { public void drive(int Speed, int Gear ); // for cars which have gears public void drive(int Speed); // for cars which do not have gears } 现在我正在创建我的实现类,比如SimpleCar和AdvanceCar SimpleCar没有齿轮 前进汽车有齿轮

我正在创建一个界面,上面写着“Car”

public interface Car {
    public void drive(int Speed, int Gear ); // for cars which have gears
    public void drive(int Speed); // for cars which do not have gears
}
现在我正在创建我的实现类,比如SimpleCar和AdvanceCar

  • SimpleCar没有齿轮
  • 前进汽车有齿轮
现在,当我编写我的实现类时,我被迫为这两种方法编写代码,尽管我不希望它们出现在我的实现类中

public class SimpleCar implements Car {
    public void drive(int Speed, int Gear ){ ... }; // dont want this method in SimpleCar
    public void drive(int Speed ){ ... };
}

有人能帮我设计一个接口,它有一个方法,但实现类有不同的签名吗?

只需删除需要
Gear
的方法声明,因为在类中,除非类本身是抽象的,否则需要实现接口中声明的每个方法


如果不想实现接口的任何方法,还应该将
SimpleCar
AdvancedCar
作为抽象类

只需删除需要
Gear
的方法声明,因为在类中,除非类本身是抽象的,否则需要实现接口中声明的每个方法

public interface Vehicle {
    public void drive(int Speed);
}

public interface Car extends Vehicle{
    public void drive(int Speed, int Gear ); 
}

public class SimpleCar implements Vehicle {
    public void drive(int Speed ){ ... };
}

public class AdvancedCar implements Car {
    public void drive(int Speed, int Gear ){ ... };
    public void drive(int Speed ){ ... };
}

如果不想实现接口的任何方法,还应该将
SimpleCar
AdvancedCar
作为抽象类

编写一个
CarAdapter
提供接口中所有方法的空实现。然后让您的
SimpleCar
扩展
CarAdapter
(默认情况下实现
Car

public interface Vehicle {
    public void drive(int Speed);
}

public interface Car extends Vehicle{
    public void drive(int Speed, int Gear ); 
}

public class SimpleCar implements Vehicle {
    public void drive(int Speed ){ ... };
}

public class AdvancedCar implements Car {
    public void drive(int Speed, int Gear ){ ... };
    public void drive(int Speed ){ ... };
}

这在Swing应用程序中很常见。

编写一个
CarAdapter
提供接口中所有方法的空实现。然后让您的
SimpleCar
扩展
CarAdapter
(默认情况下实现
Car


这在Swing应用程序中很常见。

您应该有一个
Car
接口和另一个名为
GearCar
的接口,该接口扩展了
Car
接口

public interface Vehicle {
    public void drive(int Speed);
}

public interface Car extends Vehicle{
    public void drive(int Speed, int Gear ); 
}

public class SimpleCar implements Vehicle {
    public void drive(int Speed ){ ... };
}

public class AdvancedCar implements Car {
    public void drive(int Speed, int Gear ){ ... };
    public void drive(int Speed ){ ... };
}

通过这种方式,您可以实现
GearCar或Car
接口

您应该有一个
Car
接口和另一个名为
GearCar
接口的接口,该接口扩展了
Car
接口

public interface Vehicle {
    public void drive(int Speed);
}

public interface Car extends Vehicle{
    public void drive(int Speed, int Gear ); 
}

public class SimpleCar implements Vehicle {
    public void drive(int Speed ){ ... };
}

public class AdvancedCar implements Car {
    public void drive(int Speed, int Gear ){ ... };
    public void drive(int Speed ){ ... };
}

通过这种方式,您可以实现
GearCar或Car
接口

参见以下设计。我已从
汽车
接口中删除
档位
,因为根据您的要求,它不适用于所有汽车,因此不能作为接口的一部分

public interface Vehicle {
    public void drive(int Speed);
}

public interface Car extends Vehicle{
    public void drive(int Speed, int Gear ); 
}

public class SimpleCar implements Vehicle {
    public void drive(int Speed ){ ... };
}

public class AdvancedCar implements Car {
    public void drive(int Speed, int Gear ){ ... };
    public void drive(int Speed ){ ... };
}
public interface Car 
{     
    // public void drive(int Speed, int Gear ); // for cars which have gears     
    public void drive(int Speed); // for cars which do not have gears 
}

public abstract class SimpleCar implements Car
{
    public void drive(int speed) { ... }
    public abstract void accelerate(); // you can move it to interface also
}

public abstract class AdvancedCar implements Car
{
    protected int CURRENT_GEAR = 1;
    public void drive(int speed) { ... }
    public void changeGear(int gear) { ... }
    public abstract void accelerate();
}

public class Reva extends SimpleCar
{
    // provide implementation for accelerate
}

public class Ferrari extends AdvancedCar
{
    // provide implementation for accelerate
}

见下面的设计。我已从
汽车
接口中删除
档位
,因为根据您的要求,它不适用于所有汽车,因此不能作为接口的一部分

public interface Car 
{     
    // public void drive(int Speed, int Gear ); // for cars which have gears     
    public void drive(int Speed); // for cars which do not have gears 
}

public abstract class SimpleCar implements Car
{
    public void drive(int speed) { ... }
    public abstract void accelerate(); // you can move it to interface also
}

public abstract class AdvancedCar implements Car
{
    protected int CURRENT_GEAR = 1;
    public void drive(int speed) { ... }
    public void changeGear(int gear) { ... }
    public abstract void accelerate();
}

public class Reva extends SimpleCar
{
    // provide implementation for accelerate
}

public class Ferrari extends AdvancedCar
{
    // provide implementation for accelerate
}

这另见“利斯科夫替代原理”(阅读Bob叔叔对文章“正方形不是矩形”的评论:如果我没有传达我的要求,我很抱歉。这是为了创建具有不同方法签名的实现类。您向我展示的示例更改了实现类的设计,使其具有与驱动方法相同的签名。但感谢您提供的快速详细信息d例如,可能对其他人有帮助如果你在一个界面中放置两个
drive
方法的签名,这意味着每辆车都必须以两种方式驾驶。但在你的要求中不是这样。所以你做了这些更改。这也请参见“Liskov替换原则”(阅读Bob叔叔对文章“正方形不是矩形”的评论:如果我没有传达我的要求,我很抱歉。这是为了创建具有不同方法签名的实现类。您向我展示的示例更改了实现类的设计,使其具有与驱动方法相同的签名。但感谢您提供的快速详细信息d例如,可能对其他人有帮助如果你在一个界面中放置两个
drive
方法的签名,这意味着每辆车都必须以两种方式驾驶。但你的要求不是这样的。所以你做了这些更改。但是我只想给我的用户一个界面,但我只想给我的用户一个界面这样我就有了两个界面类vehicle和car。我只想给我的用户一个InterfaceEyes,但你有两个不同的东西,问题是关于界面设计:)但是,如果你想要一个接口,就保留你拥有的接口。如果你不想在SimpleCar中实现两个方法,让驱动方法的gear参数调用第二个方法,而你的gear参数。这样我将有两个接口类vehicle和car。我只想给我的用户一个InterfaceEye,但是你有两个不同的问题,问题是关于界面设计:)但是,如果你想要一个接口,就保留你现有的接口。如果你不想在SimpleCar中实现两个方法,让带gear参数的驱动方法的实现调用带gear参数的第二个方法。谢谢,你能告诉我@Override是必要的吗?谢谢。@Override注释是可选的。你可以移动它们。编译器会识别它们的谢谢,你能告诉我@Override是必要的吗?也谢谢。@Override注释是可选的。你可以删除它们。编译器会识别它们