2016-11-25 46 views
3

我有一個類型的類其是GeneralProduct,它看起來如下:訪問的常用方法沒有鑄造對象

public class GeneralProduct() 
{ 
    String label; 
    Object obj; 
    public GeneralProduct(String label, Object obj) 
    { 
    this.label = label; 
    this.obj = obj; 
    } 
} 

然後,我有兩個不同的類,ProductAProductB。這兩個類都有一個通用的方法,稱爲getPrice()。在另一方面,我有一個數組稱爲auxList

ArrayList<GeneralProduct> auxList = new ArrayList<GeneralProduct>(); 
auxList.add(new GeneralProduct(new ProductA(), "ProductA")); 
auxList.add(new GeneralProduct(new ProductB(), "ProductB")); 

現在的問題是,我不能在課堂上從auxListProductAProductB訪問getPrice()。我怎麼能管理這個?我應該使用這樣的東西嗎?如果是這樣,我怎樣才能從孩子繼承getPrice()方法?

public class ProductA extends GeneralProduct 
+0

getPrice()應作爲抽象方法在基類GeneralProduct類中聲明。 http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html –

+0

我可能誤解了這個問題。爲什麼'GeneralProduct'將'ProductA' /'ProductB'作爲'obj'參數? –

+0

該類聲明看起來沒有語法有效 –

回答

5

在你的問題,好像ProductAProductB意味着是的GeneralProduct類;也就是說,ProductA「是」GeneralProduct,只是更專業。

如果是這樣的話:定義GeneralProduct與一個摘要getPrice方法(但繼續閱讀¹),子類實現。你可能還廢除obj,你不需要它:

public abstract class GeneralProduct { 
    String label; 
    public GeneralProduct(String label) 
    { 
     this.label = label; 
    } 

    public abstract double getPrice(); 
} 

class ProductA extends GeneralProduct { 
    @Override 
    public double getPrice() { 
     // implementation 
    } 
} 

// and the same for ProductB 

然後:

auxList.add(new ProcuctA("ProductA")); 
auxList.add(new ProcuctB("ProductB")); 

(但你可以把obj回來,如果你需要的東西)

請注意,getPrice是抽象的,如果有一個合理的實現,GeneralProduct可以提供,使得在子類中覆蓋它可選。

你甚至可以把它進一步從實施分離出來的產品接口:

public interface Product { 
    double getPrice(); 
} 

則列表將

List<Product> list = new ArrayList<Product>(); 

如果您仍然需要GeneralProduct(如果有必要對於基類),它可以實現該接口。

public abstract class GeneralProduct implements Product { 
    // ... 
} 

但是,如果你並不需要一個基類所有,ProductAProductB可以只實現接口本身。


然而,繼承是唯一一家提供功能的方式,有時它是正確的方式,和其他時間另一種方法是有用的:組成。在這種情況下,GeneralProduct將「具有」ProductAProductB,但ProductA(和ProductB)與GeneralProduct不具有「是」關係。

這仍然可能涉及的接口和/或一個抽象類,只是在不同的地方:

public interface Product { 
    double getPrice(); 
} 

class ProductA implements Product { 
    public double getPrice() { 
     // implementation 
    } 
} 

// ...same for ProductB 

public class GeneralProduct { 
    String label; 
    Product product; 
    public GeneralProduct(String label, Product product) 
    { 
     this.label = label; 
     this.product = product; 
    } 

    // You might have something like this, or not 
    public double getProductPrice() { 
     return this.product.getPrice(); 
    } 
} 

// Then using it: 
auxList.add("ProductA", new ProcuctA("ProductA")); 
auxList.add("ProductB", new ProcuctB("ProductB")); 

雙方繼承和組合是強大的工具。

+0

如果我們選擇繼承而不是合成,那麼'對象'字段是不必要的 – Andrew

+0

@AndrewTobilko:的確,我不完全確定'obj'的目標是什麼。這看起來像一種繼承情況,但也許我應該把作曲標爲選項。 –

+0

確切地說,如果我們選擇繼承我猜對象可以被刪除。非常感謝你! – pistacho