为了简单明了起见:
选项1
abstract class Transport {
foo();
}
abstract class AutomonousTransport extends Transport {
bar();
}
class Car extends AutonomousTransport {
}
class Train extends Transport {
}
采用这种方法,您需要决定继承哪个类以获得所需的功能。
这种方法的潜在缺点是,如果您有许多不同的功能(而在Java中您只能从一个类继承),那么就会出现问题。
为了克服这个问题,如果您只继承了功能(行为)而没有继承状态,请考虑使用带有默认方法的接口代替抽象类。这在某种程度上像其他语言中的Traits,但存在一些限制:
interface Transport {
default foo () {...}
}
interface AutonomousTransport extends Transport {
default bar() {}
}
interface WheelSupportTransport extends Transport {
default rotateWheelLeft() {...}
default rotateWheelRight() {...}
}
class Car implements AutomonousTransport, WheelSupportTransport {
}
class Train implements Transport {...}
选项2
abstract class Transport {
foo()
}
final class AutonomousStuff {
bar()
}
class Car extends Transport {
AutonomousStuff autonomousStuff;
}
class Train extends Transport {
}
这种方法基于“优先使用组合而不是继承”的思想。将行为作为内部数据字段添加到所需的类中,并通过此字段获得所需的一组方法(功能)的访问权限。
abstract class Transport {
foo()
}
abstract class AutonomousCapable extends Transport {
private final Transport transport;
public AutonomouseCapable(Transport transport) {
this.transport = transport;
}
bar()
foo() {
transport.foo();
}
}
class Car extends Transport {}
class Train extends Transport {}
在创建汽车时,请使用
new AutonomousCapable(new Car())
。
这遵循“装饰者模式”(又称包装器模式)的思想。您可以在运行时通过“装饰”对象(汽车)来增加一组额外的行为。
AutonomousTransport
类,包装任何实现了Transport
接口的类,并提供自主操作所需的功能。 - markspaceprivate AutonomousCapability autonomy
,其中包含所有数据和行为。 - fps