2010-04-07 59 views
0

EDITED內擴展的類字段:的Java擴展類 - 分享超類

開門見山...我有一類

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給我一個錯誤的路線: 「找不到符號構造MyClass的(P_Gen)」

oP_Gen = new MyClass(this); 

聲明

我想要實現的是使P.oP可以從MyClass2中獲得。

我最初的想法是P.this === P_Gen.this。換句話說,P_Gen在從super()調用時消失,剩下的只是P的擴展類。

+0

好吧,我有一堆MyClass(1 .... x)。他們都需要從P_Gen中實例化。但我希望他們能夠訪問P,而不僅僅是P_Gen。那可能嗎? – Bastan 2010-04-07 22:07:49

回答

0

OK,

  1. 在類MyClass2,構造函數應該被命名爲 'MyClass2'
  2. 你爲什麼不盤定義構造函數是這樣的:
public MyClass(P_Gen thisObject){...} 
public MyClass2(P_Gen thisObject){...} 

這樣做,您可以執行如下操作:

new MyClass(new P()); 

而且你需要投thisObjectPMyClassMyClass2 contructors,那麼你就能得到oP變量。 我的建議4you是關於java繼承的更多一點。

JP

0

我對你的問題(和你的代碼,它沒有任何地方的doSomething()方法)有點困惑,但是你可能受益於P_Gen是一個抽象類和抽象方法doSomething()。然後P可以實現該方法,任何引用P_Gen的東西都可以調用它(並且如果這是P的實例,則在P中獲得實現)。

+0

我已經在我身邊做了一些測試後編輯了整個問題。希望它使更多的敏感。 – Bastan 2010-04-07 20:21:24

+0

後續問題:P_Gen.oP_Gen和P.oP打算是同一個對象嗎?或者一個P的實例需要有一個oP和一個oP_Gen? – nojo 2010-04-07 21:55:08

+0

我在最後一個問題上得到了什麼:如果他們打算成爲同一個對象,那麼P不應該聲明oP成員,並且您可以在不進行任何投射的情況下訪問oP_Gen。 – nojo 2010-04-07 21:58:12

0

一個良好的夜間睡眠後....這不是我想這樣做是錯誤的,但我的做法完全。我回到了OOP的開頭。對我感到羞恥。無論如何,我給了@juanp的答案,因爲他說:「我的建議是你更多地關注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方法。

這一切都讓我覺得,也許.... :-) ...另一天。感謝您幫助我重新走上正軌。