Java 正确重写已在父方法中实现的祖父母方法
编辑:看来我的问题完全来自其他地方。如果您还没有阅读本主题的其余部分,我有一个Java 正确重写已在父方法中实现的祖父母方法,java,polymorphism,overriding,decorator,Java,Polymorphism,Overriding,Decorator,编辑:看来我的问题完全来自其他地方。如果您还没有阅读本主题的其余部分,我有一个a类、一个B类扩展a类、一个B类编辑器扩展B类。 我原以为我无法在我的decorator中重写类B中的特定函数,但经过几天的测试和试用,我的问题似乎在于创建线程的方式。 class A实现Runnable,并有一个函数listen()创建线程并调用start()。 我用参数this创建线程。这一点很重要,因为在创建线程的特定时间,此将属于B类 newbdecorator(newb()); //^线程是在创建此对象时创建
a类
、一个B类
扩展a类
、一个B类编辑器
扩展B类
。
我原以为我无法在我的decorator中重写类B
中的特定函数,但经过几天的测试和试用,我的问题似乎在于创建线程的方式。
class A
实现Runnable,并有一个函数listen()
创建线程并调用start()
。
我用参数this创建线程。这一点很重要,因为在创建线程的特定时间,此
将属于B类
newbdecorator(newb());
//^线程是在创建此对象时创建的,然后才能作为参数传递给BDecorator
由于线程属于类B
,因此它将调用用于创建它的B对象的foo()
虽然我不会说这个问题已经解决了,但它现在是一个完全不同的问题,与多态性无关。非常感谢。
@akuzminykh、@dreamcrash和@Itay Dumay帮助我解决了这个问题,并正确地格式化了这篇文章
我有一个抽象的类A
,实现RunnableA
在run()
方法(简称)中执行以下操作:
final public void run(){
试一试{
这个.foo(message),;
}
//...
}
A类
还具有以下功能:
受保护的抽象void foo(字符串消息);
装饰器的第一次迭代:覆盖foo函数。
然后我创建了一个类B,它不是抽象的,这样做:
公共类B扩展了{
//构造函数和getter/setter都在这里
受保护的void foo(字符串消息){
System.out.println(消息);
}
}
这段代码运行良好。此后,我决定通过创建一个装饰器,在B
中添加一些不会改变整个应用程序工作方式的功能
公共类BDecorator扩展了B{
B装饰B;
公共图书馆(B){
this.decoratedB=b;
}
@凌驾
受保护的void foo(字符串消息){
this.decoratedB.foo(“测试foo装饰程序:“+消息”);
}
}
简而言之,我试图覆盖一个来自父母的方法,这个方法已经从他们自己的父母那里实现了所述方法(孙辈覆盖了来自父母的方法,实现了来自祖父母的方法)
装饰器的第二次迭代:覆盖在B
中创建的新条形函数
奇怪的是,我还有一个用B
编写的方法,就像这样:
公共类B扩展了{
//构造函数和getter/setter都在这里
受保护的void foo(字符串消息){
System.out.println(消息);
}
受保护的空栏(字符串消息){
System.out.println(消息);
}
}
条码
在A类
中的任何位置都不存在。
我可以确认程序将使用以下覆盖(当我放置断点时)实际调用BDecorator::bar()
:
公共类BDecorator扩展了B{
B装饰B;
公共图书馆(B){
this.decoratedB=b;
}
@凌驾
受保护的void foo(字符串消息){
this.decoratedB.foo(“测试foo装饰程序:“+消息”);
}
//此方法不在A中。它只存在于B中,并且由于某些原因被调用。
@凌驾
受保护的空栏(字符串消息){
this.decoratedB.bar(“测试条装饰程序:+消息”);
}
}
以下是我的主要经历:
B firstTestSubject=new-BDecorator(新的B(…);
B计算器secondTestSubject=新的计算器(新的B(…);
//让我们测试两个foo函数
foo(“你好,世界!”);
foo(“你好,世界!”);
//现在让我们测试两个条形函数
firstTestSubject.bar(“再见,世界!”);
第二个testsubject.bar(“再见世界!)”;
输出:
> Hello world!
> Hello world!
> Testing a bar decorator: Goodbye world!
> Testing a bar decorator: Goodbye world!
问题是:为什么从未调用来自BDecorator
的foo override
问题是:为什么从未调用来自BDecorator的foo
覆盖
它被称为:
从BDecorator
类中,添加以下语句
:
@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!
调用BDecorator
类中的foo方法,然后将调用从传递给BDecorator
构造函数的B转发到foo
方法
new BDecorator(new B(...));
类B
中的实例对象
问题是:为什么从未调用来自BDecorator的foo
覆盖
它被称为:
从BDecorator
类中,添加以下语句
:
@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!
调用BDecorator
类中的foo方法,然后将调用从传递给BDecorator
构造函数的B转发到foo
方法
new BDecorator(new B(...));
类B
中的实例对象