java—正确重写父方法,已在父方法中实现

5jdjgkvh  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(303)

编辑:看来我的问题完全来自其他地方。如果你还没有读过这个主题的其余部分,我有一个 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 overrideBDecorator 从没打过电话?

sshcrbum

sshcrbum1#

问题是:为什么 foo 从bdecorator重写从未调用?
它被称为:
BDecorator 类,添加以下内容 Statement :

@Override
protected void foo(String message) {
    System.out.println("Do I even exist?");
    this.decoratedB.foo("Testing a foo decorator: " + message);
}

输出:

Do I even exist?
Testing a foo decorator: Hello world!
Do I even exist?
Testing a foo decorator: Hello world!
Testing a bar decorator: Goodbye world!
Testing a bar decorator: Goodbye world!

中的foo方法 BDecorator 类,然后将调用转发给
foo method 从b传递给 BDecorator 就你而言:

new BDecorator(new B(...));

以及类中的示例对象 B .

相关问题