【发布时间】:2023-03-18 02:48:01
【问题描述】:
我实际上正在阅读一本关于 Java 设计模式的书,而且我是新手 :)
http://www.amazon.com/Design-Patterns-Java-TM-Software/dp/0321333020/在关于复合模式的章节我遇到了一个让我困惑的代码,一个抽象类的强制转换,我也不太明白当子类调用抽象超类的构造函数时会发生什么,可以请你帮帮我!
我所说的演员表是在 isTree(已访问的集合)中
MachineComponent c = (MachineComponent) i.next();
if (visited.contains(c) || !c.isTree(visited))
如果isTree 超类方法是抽象的,我们如何在转换为他的抽象超类之后调用子类的isTree 方法?
这里是两个类的sn-ps:
package com.oozinoz.machine;
/*
* Copyright (c) 2001, 2005. Steven J. Metsker.
*/
import java.util.*;
import com.oozinoz.iterator.ComponentIterator;
/**
* Objects of this class represent either individual machines or composites of
* machines.
*/
public abstract class MachineComponent {
/*
* Subclasses implement this to support the isTree() algorithm.
*/
protected abstract boolean isTree(Set s);
// rest of class omitted
}
2:
package com.oozinoz.machine;
/*
* Copyright (c) 2001, 2005. Steven J. Metsker.
*/
import java.util.*;
import com.oozinoz.iterator.ComponentIterator;
import com.oozinoz.iterator.CompositeIterator;
/**
* Represent a collection of machines: a manufacturing line, a bay, or a
* factory.
*/
public class MachineComposite extends MachineComponent {
protected List components = new ArrayList();
/**
* @param visited a set of visited nodes
* @return true if this composite is a tree
* @see MachineComponent#isTree()
*/
protected boolean isTree(Set visited) {
visited.add(this);
Iterator i = components.iterator();
while (i.hasNext()) {
MachineComponent c = (MachineComponent) i.next();
if (visited.contains(c) || !c.isTree(visited))
return false;
}
return true;
}
// rest of class omitted
}
【问题讨论】:
-
如果您要转储整个文件,请正确格式化您的代码。
标签: java inheritance abstract-class