Java - 扩展整个 class 层次结构
Java - extending the whole class hierarchy
我有一个这样的 class 层次结构:
abstract class BaseThing
{
public abstract void doSomething();
}
class Thing1 extends BaseThing
{
@Override
public void doSomething()
{
doSomethingWithThing1();
}
}
class Thing2 extends BaseThing
{
@Override
public void doSomething()
{
doSomethingWithThing2();
}
}
// A dozen more classes that extend the BaseThing class.
我需要创建整个树的扩展版本。 Java中没有多重继承,所以我创建为:
interface BaseThingExt
{
public void doSomethingElse();
}
class Thing1Ext extends Thing1 implements BaseThingExt
{
@Override
public void doSomethingElse()
{
doSomethingElseWithThing1();
}
}
// All Thing.. classes are extended by ThingExt... classes
现在是问题。 我可以将所有 ThingExt class 的一些公共字段放在哪里? 我不能将它们放在基本界面中,因为它们会变成 final static
。我无法将 BaseThingExt 设为抽象 class,因为 Java 不支持多重继承。我不敢相信唯一的解决办法是在所有 ThingExt classes!
中复制它们十几次
编辑:请注意,所有 ThingExt classes 都应扩展其相应的 Thing classes 而不仅仅是 BaseThing class,因为每个派生 [=] 中都有一些细节28=]。所以 的回答是行不通的。
通常的技巧是使用组合而不是继承:
interface BaseThingExt
{
public void doSomethingElse();
}
class ConcreteImplementation implements BaseThing, BaseThingExt {
private final BaseThing thingDelegate;
private final BaseThingExt extDelegate;
public ConcreteImplementation(BaseThing thing, BaseThingExt ext) {
this.thingDelegate = thing;
this.extDelegate = ext;
}
@Override
public void doSomething() {
thingDelegate.doSomething();
}
@Override
public void doSomethingElse() {
extDelegate.doSomethingElse();
}
}
我建议加个超级class AbstractBaseThingExt
:
abstract class AbstractBaseThingExt implements BaseThingExt
{
private Object commonField;
public Object getCommonField(){}
public Object setCommonField(Object commonField){}
}
class ThingExt extends AbstractBaseThingExt
{
public ThingExt(BaseThing base) {
this.base = base;
}
public void doSomething()
{
this.base.doSomething();
}
}
class ThingExt 应该在适当的时候将实现委托给 base
。
我有一个这样的 class 层次结构:
abstract class BaseThing
{
public abstract void doSomething();
}
class Thing1 extends BaseThing
{
@Override
public void doSomething()
{
doSomethingWithThing1();
}
}
class Thing2 extends BaseThing
{
@Override
public void doSomething()
{
doSomethingWithThing2();
}
}
// A dozen more classes that extend the BaseThing class.
我需要创建整个树的扩展版本。 Java中没有多重继承,所以我创建为:
interface BaseThingExt
{
public void doSomethingElse();
}
class Thing1Ext extends Thing1 implements BaseThingExt
{
@Override
public void doSomethingElse()
{
doSomethingElseWithThing1();
}
}
// All Thing.. classes are extended by ThingExt... classes
现在是问题。 我可以将所有 ThingExt class 的一些公共字段放在哪里? 我不能将它们放在基本界面中,因为它们会变成 final static
。我无法将 BaseThingExt 设为抽象 class,因为 Java 不支持多重继承。我不敢相信唯一的解决办法是在所有 ThingExt classes!
编辑:请注意,所有 ThingExt classes 都应扩展其相应的 Thing classes 而不仅仅是 BaseThing class,因为每个派生 [=] 中都有一些细节28=]。所以
通常的技巧是使用组合而不是继承:
interface BaseThingExt
{
public void doSomethingElse();
}
class ConcreteImplementation implements BaseThing, BaseThingExt {
private final BaseThing thingDelegate;
private final BaseThingExt extDelegate;
public ConcreteImplementation(BaseThing thing, BaseThingExt ext) {
this.thingDelegate = thing;
this.extDelegate = ext;
}
@Override
public void doSomething() {
thingDelegate.doSomething();
}
@Override
public void doSomethingElse() {
extDelegate.doSomethingElse();
}
}
我建议加个超级class AbstractBaseThingExt
:
abstract class AbstractBaseThingExt implements BaseThingExt
{
private Object commonField;
public Object getCommonField(){}
public Object setCommonField(Object commonField){}
}
class ThingExt extends AbstractBaseThingExt
{
public ThingExt(BaseThing base) {
this.base = base;
}
public void doSomething()
{
this.base.doSomething();
}
}
class ThingExt 应该在适当的时候将实现委托给 base
。