【发布时间】:2009-09-07 01:22:23
【问题描述】:
参考here
A 是一个预编译的 Java 类(我也有源文件)
B 是我正在创作的 Java 类
B 扩展 A。
如何实现逻辑以使 A 可以调用 B 拥有的方法。
以下是条件:
- 我不想碰 A(仅作为 最后一个选项,如果没有 存在其他解决方案)。
- 我不想使用反射。
如上所述,如果需要,我可以修改 A. 无论哪种方式,可能的解决方案是什么?
【问题讨论】:
标签: java inheritance
参考here
A 是一个预编译的 Java 类(我也有源文件)
B 是我正在创作的 Java 类
B 扩展 A。
如何实现逻辑以使 A 可以调用 B 拥有的方法。
以下是条件:
如上所述,如果需要,我可以修改 A. 无论哪种方式,可能的解决方案是什么?
【问题讨论】:
标签: java inheritance
Class A 应该定义它要调用的方法(可能是抽象的,A 应该是一个抽象类,根据 Paul Haahr 的优秀 guide); B 可以(实际上必须是具体的,如果方法是抽象的)覆盖这些方法。现在,从 A 中的其他方法调用这些方法,当发生在 B 类的实例中时,转到 B 的覆盖。
整体设计模式被称为Template Method;要覆盖的方法通常称为“挂钩方法”,执行调用的方法称为“组织方法”。
【讨论】:
setTheI 设置器(B 的构造函数可以使用 this 作为参数调用)。
是的,如果您重写超类/基类的函数,那么对这些函数的调用in 基类将转到子类/派生类。在我看来,这似乎是一个糟糕的设计,但你去吧。
class Base
{
public void foo()
{
doStuff();
}
public void doStuff()
{
print("base");
}
}
class Derived extends Base
{
@Override
public void doStuff()
{
print("derived");
}
}
new Derived().foo(); // Prints "derived".
显然Derived 的所有方法都必须已经在Base 中定义,但否则(没有自省)在逻辑上是不可能的。
【讨论】:
final 显式阻止它)。也许吧。
Base.foo 显然调用了Derived.doStuff。
我会很犹豫这样做。如果我错了,请纠正我,然后我会删除,但听起来你想维护一个 A 对象和一个 B 对象。如果它们确实不是同一个对象,那么您必须做的“捆绑在一起”(这是一个科学术语)将非常难看。
【讨论】: