Java扩展类 - 在超类中共享扩展类字段

时间:2010-04-07 18:12:17

标签: java oop code-generation

已编辑:

直截了当......我有一个班级

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);
    }
} 

MyClass:

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;
    }
}   

上面显示的P_Gen类给出了一行错误:

oP_Gen = new MyClass(this);  

声明“找不到符号构造函数MyClass(P_Gen)。”

我想要实现的是从MyClass2中获取P.oP。

我最初的想法是P.this === P_Gen.this。换句话说,P_Gen从super()调用时消失,剩下的只是P扩展类。

3 个答案:

答案 0 :(得分:0)

我对你的问题(以及你的代码,在任何地方都没有doSomething()方法)感到有点困惑,但你可能会从P_Gen中获益,它是一个带有抽象方法doSomething()的抽象类。然后P可以实现该方法,任何引用P_Gen的东西都可以调用它(并在P中获取实现,如果它是什么实例)。

答案 1 :(得分:0)

好的,

  1. 在MyClass2类中,构造函数应命名为“MyClass2”
  2. 为什么不托盘来定义这样的构造函数:
  3. public MyClass(P_Gen thisObject){...}
    public MyClass2(P_Gen thisObject){...}
    

    这样做,您可以执行以下操作:

    new MyClass(new P());
    

    此外,您需要在thisObjectP个结构中投放MyClassMyClass2,这样您就可以获得oP变量。 我的建议4你要更多地了解一下java继承。

    JP

答案 2 :(得分:0)

经过一夜安眠......这不是我想做的那不是错,而是我的方法。我回到了OOP的开头。对我感到羞耻。无论如何,我给了@juanp的答案,因为他说“我的建议4,你要更多地了解一下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方法。

所有这些让我觉得......也许.... :-) ...另一天。感谢您帮助我回到正轨。