我需要添加一个子属性List(ProductOption和ProductAttribute),它们是名为Product的父对象的属性.所有这三个类都扩展了一个抽象类CMS.
我想一般性地调用方法"attachChildToParent",但是我推迟了不可避免的事情instanceof并推迟了产品.
有没有办法我可以写这个一般,所以我可以避免演员表?
去测试:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
产品类(父级)
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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
儿童班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;
}
}
Run Code Online (Sandbox Code Playgroud)
儿童班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;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用访问者模式解决转换:在您的CMS类中,添加一个新的(抽象)方法attachTo(Product parent).在每个子类中,您可以实现此方法以在父级上调用attach,并且将解析右侧函数.
| 归档时间: |
|
| 查看次数: |
632 次 |
| 最近记录: |