我有一个类是 GeneralProduct ,它看起来如下:
public class GeneralProduct()
{
String label;
Object obj;
public GeneralProduct(String label, Object obj)
{
this.label = label;
this.obj = obj;
}
}
然后我有两个不同的类,
ProductA
和 ProductB
。这两个类都有一个称为 getPrice()
的通用方法。另一方面,我有一个名为 auxList
的数组:ArrayList<GeneralProduct> auxList = new ArrayList<GeneralProduct>();
auxList.add(new GeneralProduct(new ProductA(), "ProductA"));
auxList.add(new GeneralProduct(new ProductB(), "ProductB"));
现在的问题是我无法从
getPrice()
访问 ProductA
和 ProductB
类中的 auxList
。我怎么能做到这一点?我应该使用这样的东西吗?如果是这样,我如何从 child 那里继承 getPrice() 方法?public class ProductA extends GeneralProduct
最佳答案
在您的问题中,似乎 ProductA
和 ProductB
是 GeneralProduct
的子类;也就是说, ProductA
"is" 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
可以提供合理的实现,则在子类中覆盖它是可选的。您甚至可以更进一步,将产品的接口(interface)与实现分开:
public interface Product {
double getPrice();
}
那么列表将是
List<Product> list = new ArrayList<Product>();
如果您仍然需要
GeneralProduct
(如果需要基类),它可以实现该接口(interface)。public abstract class GeneralProduct implements Product {
// ...
}
但是如果你根本不需要基类,
ProductA
和 ProductB
可以自己实现接口(interface)。然而 ,继承只是提供功能的一种方式,有时它是正确的方式,有时另一种方法是有用的:组合。在这种情况下,
GeneralProduct
将“具有” ProductA
或 ProductB
,但 ProductA
(和 ProductB
)不会与 GeneralProduct
具有"is"关系。这仍然可能涉及接口(interface)和/或抽象类,只是在不同的地方:
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"));
继承和组合都是强大的工具。
关于java - 无需强制转换对象即可访问通用方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40809666/