如何解决是否有可能“领养”一个班级?
我目前正在编写一个类,它应该作为现有类的附加组件。例如,让我的附加类如下:
public class NewClass {}
另外,假设已经存在这样的类:
public final class ExistingClassA {}
public final class ExistingClassB {}
...
这些我是不允许改变的。
不过,对于某些算法,我想将现有类定义为 NewClass
的子类。因此,我不想使用 extends
从某个类继承,而是想实现相反的目标:我想“采用”一个类,就好像现有的类最初是这样定义的:
public final class ExistingClassA extends NewClass {}
public final class ExistingClassB extends NewClass {}
...
这在 Java 中是否可行?如果是这样,是否也可以将一个类添加为一个类的父类,该类已经扩展了另一个类?
编辑:
为了让我的情况更清楚一些,我将尝试更详细地描述我想要实现的目标。例如。假设一个变量 myVar
,它应该只是特定类的实例。如果这些类属于一个共同的父类,这就不成问题了:
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
只属于 ExistingClassA
或 ExistingClassB
类。假设我可以用我的 NewClass
“采用”这两个类,我也可以只写:
NewClass myVar; // May be of ExistingClassA,or ExistingClassB,but not ExistingClassC.
由于这似乎不可能(从阅读评论中),什么方法是最聪明的方法来实现只允许 myVar
成为 {{ 的一个子集的目标1}}?
解决方法
没有编译时机制来检查一个类是否扩展了类 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(); }
但我看不到如何您想使用这两个类。他们有同名的方法吗?为什么不简单地使用两个变量?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。