2013-05-11 112 views
0

我對Java相當陌生,我有一個類ObjectType的linkedList,我有不同的ObjectType的子類被添加到linkedList,當我拉出對象時,我被迫將它傳遞給一個類型的ObjectType,並且似乎失去了子類的繼承屬性....任何人都可以爲我闡明一些事情嗎?Java LinkedList對象繼承覆蓋

//LIST STORING OBJECT 
public class MyObjectList{ 

    private LinkedList<ObjectType> queue = new LinkedList<ObjectType>(); 

    public MyObjectList() 
    { 
     queue = new LinkedList<ObjectType>(); 
    } 

    public ObjectType addObject(ObjectType myObject) 
    { 
     queue.add(myObject); 
     return myObject; 
    } 

} 

//MY BASIC OBJECT 
public abstract class ObjectType { 

    public int objectWidth; 

    public ObjectType() {} 
} 

//MY EXTENDED OBJECT BOX 
public abstract class Box extends ObjectType { 

    public int objectWidth = 50; 

    public ObjectType() {} 
} 

//MY EXTENDED OBJECT PLATE 
public abstract class Box extends ObjectType { 

    public int objectWidth = 25; 

    public Box() {} 
} 

// OK所以現在,如果我的箱子負載添加到我的箱子名單都會有自己objectWidth設置爲零!

mList = new MyObjectList; 

for (int i=0;i<10;i++) 
{ 
    mObject = mList.addObject(new Box); 
} 

重要的是要記住,我的名單應該是由不同的對象類型,最終使baseObject需要保持,因爲它是非常重要的。如果可能的話!

+0

你不能添加一個'new Box()'它是抽象的。你能提供一個編譯和運行的例子嗎? – 2013-05-11 16:07:46

回答

2

您不能覆蓋的Java領域,所以如果你想設置objectWidth50在你的子類,你會做這樣的:

public abstract class ObjectType { 
    public int objectWidth; 
    public ObjectType() {} 
} 

public abstract class Box extends ObjectType { 
    public Box() { 
     objectWidth = 50; 
    } 
} 
+1

作爲一個脫離主題的問題,數據封裝在這裏丟失。字段objectWidth應該是私有的,公共getter/setter應該放在抽象類中 - 如果Box類需要的話,可以覆蓋它。 – Mena 2013-05-11 16:11:26

+0

感謝大家的回答!我學到了很多。 @Mena,如果我有很多屬性,那麼這個類不會得到一個大代碼沉重的做每個屬性的getter和setter?與直接設置而不是使用方法相比,有什麼優勢?謝謝!! – 2013-05-11 16:54:59

+0

@JulianYoung我知道它可能看起來很混亂,有許多屬性及其getter/setter,特別是當那些getters/setter正在執行最基本的操作時,不分別操縱參數或結果。但是,隨着代碼的發展,您可能會後悔選擇允許公共領域(例如需要檢查空值等)。如果您來自C#,請考慮一下,儘管代碼_seems_鼓勵您聲明公共屬性,但實際上並不這樣。另見:http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming) – Mena 2013-05-11 17:01:34

1

自變量不覆蓋,但隱藏,在每個子類中再次聲明變量,給它一個新的價值不工作的方法。

解決此問題的一種方法是爲您的抽象類提供一種方法,例如, getObjectWidth(),並覆蓋每個子類中的內容。由於方法可以被覆蓋,所以這種方式將顯示每個對象的具體值。

0

一個更好的模式來使用是每個像類中的常數。

//MY BASIC OBJECT 
public abstract class ObjectType { 

    public abstract int objectWidth(); 

    public ObjectType() {} 

} 

//MY EXTENDED OBJECT BOX 
public class Box extends ObjectType { 

    public int objectWidth() { return 50; } 

    public ObjectType() {} 
}