编辑:看来我的问题完全来自其他地方。如果你还没有读过这个主题的其余部分,我有一个 class A
,一个 class B
延伸 class A
,和 class BDecorator
延伸 class B
. 我以为我不能重写 class B
在我的decorator中,但经过几天的测试和试用,我的问题似乎在于创建线程的方式。 class A
实现runnable,并具有一个函数 listen()
创建线程并调用 start()
. 我用参数创建线程 this
. 这一点很重要,因为在创建线程的特定时间, this
将是类型 class B
.
new BDecorator(new B());
// ^ The thread is created with the creation of this object, before it can be passed as an argument to BDecorator
因为这根线是 class B
,它将调用 foo()
的 B object
用于创建它。
虽然我不会说这个问题已经解决了,但它现在是一个完全不同的问题,与多态性无关。感谢@akuzminykh、@dreamcrash和@itay dumay帮助我尝试解决这个问题,以及正确格式化这个帖子。
我有个摘要 class A
,实现runnable。 A
在下列情况下 run()
方法(简称):
final public void run() {
try {
this.foo(message);
}
//...
}
``` `Class A` 还具有以下功能:
protected abstract void foo(String message);
decorator的第一次迭代:重写foo函数。
然后我创建了一个类b,它不是抽象的,这样做:
public class B extends A {
// Constructors and getters/setters go here
protected void foo(String message) {
System.out.println(message);
}
}
这个代码很好用。从那以后,我决定在 `B` 通过创建一个装饰器,这不会改变整个应用程序的工作方式。
public class BDecorator extends B {
B decoratedB;
public BDecorator(B b) {
this.decoratedB = b;
}
@Override
protected void foo(String message) {
this.decoratedB.foo("Testing a foo decorator: " + message);
}
}
简而言之,我试图重写一个来自父级的方法,这个方法已经从他们自己的父级实现了所说的方法(孙子覆盖了来自父级的方法,实现了来自祖父母的方法)。
decorator的第二次迭代:重写在中创建的新bar函数 `B` .
奇怪的是我还有一个用 `B` 像这样:
public class B extends A {
// Constructors and getters/setters go here
protected void foo(String message) {
System.out.println(message);
}
protected void bar(String message) {
System.out.println(message);
}
}
``` bar
世界上任何地方都不存在 class A
. 我可以确认程序会调用 BDecorator::bar()
使用以下重写(当我放置断点时):
public class BDecorator extends B {
B decoratedB;
public BDecorator(B b) {
this.decoratedB = b;
}
@Override
protected void foo(String message) {
this.decoratedB.foo("Testing a foo decorator: " + message);
}
// This method wasn't in A. It was only present in B, and for some reasons it gets called.
@Override
protected void bar(String message) {
this.decoratedB.bar("Testing a bar decorator: " + message);
}
}
以下是我的主要经历:
B firstTestSubject = new BDecorator(new B(...));
BDecorator secondTestSubject = new BDecorator(new B(...));
// Let's test both foo functions
firstTestSubject.foo("Hello world!");
secondTestSubject.foo("Hello world!");
// Now let's test both bar functions
firstTestSubject.bar("Goodbye world!");
secondTestSubject.bar("Goodbye world!)";
输出:
> Hello world!
> Hello world!
> Testing a bar decorator: Goodbye world!
> Testing a bar decorator: Goodbye world!
问题是:为什么 foo override
从 BDecorator
从没打过电话?
1条答案
按热度按时间sshcrbum1#
问题是:为什么
foo
从bdecorator重写从未调用?它被称为:
从
BDecorator
类,添加以下内容Statement
:输出:
中的foo方法
BDecorator
类,然后将调用转发给foo
method
从b传递给BDecorator
就你而言:以及类中的示例对象
B
.