在你的問題,好像ProductA
和ProductB
意味着是的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 {
// ...
}
但是,如果你並不需要一個基類所有,ProductA
和ProductB
可以只實現接口本身。
然而,繼承是唯一一家提供功能的方式,有時它是正確的方式,和其他時間另一種方法是有用的:組成。在這種情況下,GeneralProduct
將「具有」ProductA
或ProductB
,但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"));
雙方繼承和組合是強大的工具。
getPrice()應作爲抽象方法在基類GeneralProduct類中聲明。 http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html –
我可能誤解了這個問題。爲什麼'GeneralProduct'將'ProductA' /'ProductB'作爲'obj'參數? –
該類聲明看起來沒有語法有效 –