我需要添加一个子属性(ProductOption和ProductAttribute)列表,它们是一个名为Product的父对象的属性。这三个类都扩展了一个抽象类CMS。
我想泛泛地调用这个方法"attachChildToParent“,但是我推迟了instanceof,并将其强制转换为Product,从而推迟了不可避免的调用。
有没有一种方法可以通用地写这段代码,这样我就可以避免强制转换?
要测试:
package puzzler;
import java.util.ArrayList;
import java.util.List;
public class Tester {
public static void main(String[] args) {
Product p = new Product();
ProductAttribute pa = new ProductAttribute();
ProductOffering po = new ProductOffering();
List<ProductAttribute> lpa = new ArrayList<ProductAttribute>();
List<ProductOffering> lpo = new ArrayList<ProductOffering>();
attachChildToParent(lpa, p);
}
static void attachChildToParent(List<? extends CMS> listChild, Product parent) {
for (CMS cmsItem : listChild) {
parent.attach(cmsItem);
}
}
}Product类(父类)
package puzzler;
import java.util.List;
abstract class CMS {
String node;
}
public class Product extends CMS {
List<ProductAttribute> lpa;
List<ProductOffering> lpo;
public List<ProductAttribute> getLpa() {
return lpa;
}
public void setLpa(List<ProductAttribute> lpa) {
this.lpa = lpa;
}
public List<ProductOffering> getLpo() {
return lpo;
}
public void setLpo(List<ProductOffering> lpo) {
this.lpo = lpo;
}
public void attach(ProductAttribute childNode) {
this.getLpa().add(childNode);
}
public void attach(ProductOffering childNode) {
this.getLpo().add(childNode);
}
// I want to avoid this. Defeats the purpose of generics.
public void attach(CMS cms) {
if (cms instanceof ProductOffering) {
this.getLpo().add((ProductOffering) cms);
} else {
if (cms instanceof ProductAttribute) {
this.getLpa().add((ProductAttribute) cms);
}
}
}
}子类1
package puzzler;
import puzzler.CMS;
public class ProductAttribute extends CMS {
String node;
public String getNode() {
return node;
}
public void setNode(String node) {
this.node = node;
}
}子级2
package puzzler;
import puzzler.CMS;
public class ProductOffering extends CMS {
String node;
public String getNode() {
return node;
}
public void setNode(String node) {
this.node = node;
}
}发布于 2012-08-17 20:31:09
您可以通过使用访问者模式来解决这个问题:在CMS类中,添加一个新的(抽象)方法attachTo(Product parent)。在每个子类中,您可以实现此方法来调用父类上的attach,并将解析正确的函数。
发布于 2012-08-17 20:35:38
委派给子类:
public void attach(CMS cms) {
cms.callAdd(this);
}在CMS上添加:
public abstract void callAdd(Product product);在ProductOffering上添加:
public void callAdd(Product product) {
getLpo().add(this)
}ProductAttribute也是如此……
发布于 2012-08-17 20:33:36
覆盖?
public void attach(ProductOffering cms) {
this.getLpo().add(cms);
}
public void attach(ProductAttribute cms) {
this.getLpa().add(cms);
}https://stackoverflow.com/questions/12005769
复制相似问题