小时候可以"adopt"一个class吗?

Is it possible to "adopt" a class as a child?

我目前正在编写 class,它应该作为现有 class 的附加组件。例如,让我的附加组件 class 如下:

public class NewClass {}

此外,假设已经存在 class 如下:

public final class ExistingClassA {}
public final class ExistingClassB {}
...

这些我是不允许更改的。 不过,对于某些算法,我想将现有的 classes 定义为我的 NewClass 的子代。因此,我不想用 extends 从某些 class 继承,而是想实现相反的效果:我想“采用”一个 class,就好像现有的 classes最初是这样定义的:

public final class ExistingClassA extends NewClass {}
public final class ExistingClassB extends NewClass {}
...

这在 Java 中甚至可能吗?如果是这样,是否也可以添加一个 class 作为 class 的父级,它已经扩展了另一个 class?

编辑:

为了让我的情况更清楚一些,我将尝试更详细地描述我想要实现的目标。例如。假设一个变量 myVar,它应该只是特定 classes 的实例。如果那些 class 属于一个共同的父 class,这将不是问题:

public final class ExistingClassA extends CommonParentClass {}
public final class ExisitingClassB extends CommonParentClass {}
public final class ExistingClassC extends CommonParentClass {}

...
/* We're inside some class now... */
CommonParentClass myVar; // May be of ExistingClassA, ExistingClassB, or ExistingClassC.

现在说,我希望 myVar 仅属于 class ExistingClassAExistingClassB。假设我可以用我的 NewClass“采用”这两个 classes,我也可以只写:

NewClass myVar; // May be of ExistingClassA, or ExistingClassB, but not ExistingClassC.

因为这似乎 不可能 是可能的(从阅读评论来看),什么方法最聪明地实现只允许 myVar 的目标CommonParentClass?

的子集

没有编译时机制来检查 class 是否扩展了 class A 或 B。如果 AB 的作者没有定义他们是相关的,他们不是。

您有多种选择:

  • 您可以使用 instanceof 然后转换为指定的类型。

    Object myObj = ...;
    if (myObj instanceof Alpha) {
        ((Alpha) myObj).doSomething();
    }
    else if (myObj instanceof Bravo) {
        ((Bravo) myObj).doSomethingElse();
    }
    else {
        throw new IllegalArgumentException("myObj" must be of either Alpha or Bravo");
    }
    
  • 或者您可以创建一个包装器对象,在构造函数中接受:

    class Either<A, B> {
        A a;
        B b;
        boolean isA;
        Either(A a) {
            this.a = a;
            this.isA = true;
        }
        Either(B b) {
            this.b = b;
        }
        boolean isA() {
            return isA;
        }
        A getA() {
            return a;
        }
        B getB() {
            return b;
        }
    }
    

    然后调用它:

    Either<Alpha, Bravo> either = new Either(...);
    if (either.isA()) {
        either.getA().doSomething();
    }
    else {
        either.getB().doSomethingElse();
    }
    

但我没看到如何使用这两个class。他们有同名的方法吗?为什么不直接使用两个变量?