具有多个具有不同签名的实现类的java接口
我正在创建一个界面,上面写着“Car”具有多个具有不同签名的实现类的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没有齿轮 前进汽车有齿轮
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注释是可选的。你可以删除它们。编译器会识别它们