📅  最后修改于: 2023-12-03 15:12:39.631000             🧑  作者: Mango
这是一道出自GATE-CS-2000的问题,需要考生根据题目描述,写出程序的输出结果。以下是本题的具体描述:
假设我们拥有两个门:一扇正常的门和一扇“高级”门。正常门有一个自动关闭的机制,而高级门不需要手动关闭,可以自动感知人的进出并展开或关闭。在程序中,我们使用两个类代表这两个门,正常门的类为RegularGate
,高级门的类为AdvancedGate
。
RegularGate
类中有一个方法open()
,用于打开门。AdvancedGate
类继承RegularGate
类,并且重写了open()
方法,使得门被打开后不会自动关闭,直到有一个新的进入事件发生。
现在,我们定义了一个叫做GateKeeper
的类,这个类维护着一个门列表。当有一个新的事件发生时,GateKeeper
类找到将要进入或离开的门,然后打开或关闭门。具体的实现细节请参见以下代码:
import java.util.ArrayList;
abstract class Gate {
abstract public void open();
}
class RegularGate extends Gate {
public void open() {
System.out.println("Opened regular gate");
}
}
class AdvancedGate extends RegularGate {
Boolean isOpen = false;
public void open() {
isOpen = true;
System.out.println("Opened advanced gate");
}
}
public class GateKeeper {
ArrayList<Gate> gates = new ArrayList<Gate>();
public void addGate(Gate g) {
gates.add(g);
}
public boolean enter(String id) {
boolean success = false;
for(int i=0; i<gates.size(); i++) {
if (gates.get(i) instanceof AdvancedGate){
AdvancedGate gate = (AdvancedGate)gates.get(i);
if (gate.isOpen) {
success = true;
} else {
gate.open();
success = true;
}
} else {
gates.get(i).open();
success = true;
}
}
System.out.println(id + " enter: " + success);
return success;
}
public boolean exit(String id) {
boolean success = false;
for(int i=0; i<gates.size(); i++) {
if (gates.get(i) instanceof AdvancedGate){
AdvancedGate gate = (AdvancedGate)gates.get(i);
if (gate.isOpen) {
gate.isOpen = false;
success = true;
}
} else {
gates.get(i).open();
success = true;
}
}
System.out.println(id + " exit: " + success);
return success;
}
}
以上代码实现了一个门控系统,其中门分为普通门(RegularGate
)和高级门(AdvancedGate
),GateKeeper
类维护着门列表并且在门内或门外人员进出时操作门的开闭。接下来,我们来看一下以下测试代码的运行结果:
public class TestGateKeeper {
public static void main(String[] args) {
GateKeeper gateKeeper = new GateKeeper();
gateKeeper.addGate(new RegularGate());
gateKeeper.addGate(new AdvancedGate());
gateKeeper.addGate(new AdvancedGate());
gateKeeper.enter("Alice");
gateKeeper.enter("Bob");
gateKeeper.exit("Alice");
gateKeeper.enter("Charlie");
gateKeeper.exit("Bob");
}
}
运行以上代码,控制台输出的结果是:
Opened regular gate
Opened advanced gate
Alice enter: true
Opened advanced gate
Bob enter: true
Alice exit: true
Charlie enter: true
Bob exit: false
根据以上输出结果,我们可以看到,在第一次运行enter()
方法时,系统打开了一个普通门(RegularGate
)和一个高级门(AdvancedGate
)来让进入的人员进入系统;接着,当"Alice"成功进入系统后,Bob也进入了系统,此时门的状态没有进行改变;当"Alice"退出系统后,门的状态被重置到了默认状态,即高级门关闭并且普通门关闭;随后Charlie进入系统,Bob尝试离开系统但失败了,因为门已经处于关闭状态了。因此,以上代码的输出结果是正确的。