[英]Java extends classes - Share the extended class fields within the super class
编辑:
直截了当...我有一堂课
public class P_Gen{
protected String s;
protected Object oP_Gen;
protected Object oP_Gen2;
public P_Gen(String str){
s = str;
oP_Gen = new MyClass(this);
oP_Gen2 = new MyClass2(this);
}
}
扩展类:
public class P extends P_Gen{
protected Object oP;
public P(String str){
super(str);
oP = new MyClass(this);
}
}
我的课:
public class MyClass{
protected Object oMC;
public MyClass(P extendedObject){
this.oMC = extendedObject.oP;
}
}
MyClass2:
public class MyClass2{
protected Object oMC2;
public MyClass(P_Gen thisObject){
this.oMC2 = thisObject.oP;
}
}
上面显示的Class P_Gen给我以下行错误:
oP_Gen = new MyClass(this);
说明“找不到符号构造函数MyClass(P_Gen)”。
我要实现的是使MyClass2提供P.oP。
我最初的想法是P.this === P_Gen.this。 换句话说,当从super()
调用时,P_Gen消失,剩下的仅是扩展类P。
我对您的问题(以及您的代码,在任何地方都没有doSomething()方法)感到困惑,但是您可能会受益于P_Gen是带有抽象方法doSomething()的抽象类。 然后,P可以实现该方法,任何引用P_Gen的对象都可以调用该方法(如果是实例,则可以在P中获得实现)。
好,
public MyClass(P_Gen thisObject){...} public MyClass2(P_Gen thisObject){...}
这样做,您可以执行以下操作:
new MyClass(new P());
另外,您还需要在MyClass
和MyClass2
构造MyClass2
thisObject
MyClass2
为P
,这样便可以获取oP
变量。 我的建议4you是关于Java继承的更多内容。
J.P
经过一夜安眠。。。不是我想做的错是错误的,而是我的态度完全相同。 我回到了OOP的开始。 真可惜 无论如何,我给@juanp答案是因为他说“我的建议4you是更多地了解Java继承。”
对于那些感兴趣的人,它应该是这样的:
生成的P_Gen类:
public abstract class P_Gen{
protected String s;
protected Object oP;
public P_Gen(String str){
this.s = str;
init(str);
}
protected void init(String str){
if(this instanceof P){
oP = new MyClass((P)this);
}
}
}
扩展的P类:
public class P extends P_Gen{
public String sSTR;
public P(String str){
super(str);
}
@Override
protected void init(String str){
this.sSTR = str;
this.oP = new MyClass(this);
}
}
MyClass类:
public class MyClass{
protected Object oMC;
public MyClass(P extendedObject){
this.oMC = extendedObject.sSTR;
}
}
我所做的是将MyClass实例化从构造函数移至init函数。 然后,该init函数在扩展类中被覆盖.....我知道非常基本的东西。
更基本的是,在我的P_Gen类中添加了抽象,以防止直接实例化它。 我也可以在P_Gen中声明一个抽象的init方法。
所有这些使我觉得也许.... :-) ...前一天。 感谢您帮助我重回正轨。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.