小时候可以"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 ExistingClassA
或 ExistingClassB
。假设我可以用我的 NewClass
“采用”这两个 classes,我也可以只写:
NewClass myVar; // May be of ExistingClassA, or ExistingClassB, but not ExistingClassC.
因为这似乎 不可能 是可能的(从阅读评论来看),什么方法最聪明地实现只允许 myVar
的目标CommonParentClass
?
的子集
没有编译时机制来检查 class 是否扩展了 class A 或 B。如果 A
和 B
的作者没有定义他们是相关的,他们不是。
您有多种选择:
您可以使用 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。他们有同名的方法吗?为什么不直接使用两个变量?
我目前正在编写 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 ExistingClassA
或 ExistingClassB
。假设我可以用我的 NewClass
“采用”这两个 classes,我也可以只写:
NewClass myVar; // May be of ExistingClassA, or ExistingClassB, but not ExistingClassC.
因为这似乎 不可能 是可能的(从阅读评论来看),什么方法最聪明地实现只允许 myVar
的目标CommonParentClass
?
没有编译时机制来检查 class 是否扩展了 class A 或 B。如果 A
和 B
的作者没有定义他们是相关的,他们不是。
您有多种选择:
您可以使用 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。他们有同名的方法吗?为什么不直接使用两个变量?