java - 使方法可重用

标签 java oop

我今天早些时候问过类似的问题,但现在我被告知要求已更改。

我有 3 个类 - ProductProductOffering (PO) 和 ProductOfferingLists (POL)。产品含有 PO,PO 含有 POL。所有这些类都扩展了一个名为 CMS 的抽象类。

我想将 PO 附加到 P,将 POL 附加到 PO,但我正在寻找一种可重用的方法,因为除了类名之外,逻辑是相同的。

不幸的是,我的测试器类需要两个方法,并且层次结构类需要强制转换来履行抽象 CMS 契约。

这让我发疯。如何使其更具可重用性,这样我就不需要多种方法和转换?

package puzzler;
import java.util.ArrayList;
import java.util.List;

public class Tester {
    public static void main(String[] args) {
        Product p = new Product();
        PO pa = new PO();
        POL po = new POL();

        List<PO> lpa = new ArrayList<PO>();
        List<POL> lpo = new ArrayList<POL>();

        attachChildToParent(lpa, p);
        attachChildToParent(lpo, pa);
    }

    static void attachChildToParent(List<PO> listChild, Product parent) {
        for (PO po : listChild) {
            parent.attach(po);
        }
    }

    static void attachChildToParent(List<POL> listChild, PO parent) {
        for (POL po : listChild) {
            parent.attach(po);
        }
    }
}

CMS 类:

package puzzler;

abstract class CMS {
    abstract void attach(CMS childNode);
}

产品类 - 拥有 PO 的层次结构顶部:

package puzzler;
import java.util.List;

public class Product extends CMS {
    List<PO> lpo;

    public List<PO> getLpo() {
        return lpo;
    }

    public void setLpo(List<PO> lpo) {
        this.lpo = lpo;
    }

    @Override
    void attach(CMS childNode) {
        this.getLpo().add((PO)childNode);
    }
}

产品供应,由产品拥有,进而拥有产品供应列表

package puzzler;
import java.util.List;

public class PO extends CMS {
    List<POL> lpol;

    public List<POL> getLpo() {
        return lpol;
    }

    public void setLpo(List<POL> lpol) {
        this.lpol = lpol;
    }


    @Override
    void attach(CMS childNode) {
        this.getLpo().add((POL)childNode);
    }
}    

PO 拥有的产品供应列表 (POL)

package puzzler;

public class POL extends CMS {
    @Override
    void attach(CMS childNode) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

最佳答案

(使用Java 7语法,但易于适应Java 6)

按如下方式定义您的 CMS 类:

public abstract class CMS<C extends CMS<?>> {
    public abstract void attach(C childNode);
}

那么您的 Product 类可能如下所示:

public class Product extends CMS<PO> {
    private List<PO> lpo = new ArrayList<>();

    public List<PO> getLpo() {
        return lpo;
    }

    public void setLpo(List<PO> lpo) {
        this.lpo = lpo;
    }

    @Override
    public void attach(PO childNode) {
        getLpo().add(childNode);
    }
}

那么你的 PO 类可以如下所示:

public class PO extends CMS<POL> {
    private List<POL> lpol = new ArrayList<>();

    public List<POL> getLpo() {
        return lpol;
    }

    public void setLpo(List<POL> lpol) {
        this.lpol = lpol;
    }

    @Override
    public void attach(POL childNode) {
        getLpo().add(childNode);

    }
}

然后你的 POL 类可以如下所示:

public class POL extends CMS<CMS<?>> {
    @Override
    public void attach(CMS<?> child) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

最后,您的 Tester 类可能如下所示:

public class Tester {
      public static void main(String[] args) {
            Product p = new Product();
            PO po = new PO();

            List<PO> pos = new ArrayList<PO>();
            List<POL> pols = new ArrayList<POL>();

            attachChildToParent(pos, p);
            attachChildToParent(pols, po);
        }

    private static <C extends CMS<?>> void attachChildToParent(List<C> childNodes, CMS<C> parent) {
        for (C childNode : childNodes) {
            parent.attach(childNode);
        }
    }
}

只需要一种方法,无需强制转换。

关于java - 使方法可重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12007533/

相关文章:

java - Swagger 示例参数值

java - 如何将对象从获取 Controller 提交到后置 Controller ?

c++ - 在遍历 vector 时使用什么索引

oop - Map 和 SortedMap - 冗余方法声明

python - 如何使用 OpenCV Python 检测对象的边缘点?

python - 在Python中转换多个属性中的dict属性

java - 从文本中删除回车符和特殊字符

java - JToolBar 等价于frame.setJMenuBar(ie.createMenuBar()); 的是什么?

java - 如果等于 mustache 的条件

java - 将原始类型重新编码为泛型