我正在重写Jack Crenshaw的“让我们构建一个编译器”,从Turbo Pascal 4.0到JAVA。这是激励因为经典书籍还没有O-O版本
Is there a more modern, OO version of "Let's Build a Compiler"?
这本书包含15章。编译器以递增方式呈现:第一章提供整个编译器的样板代码,然后每章为前一章的Pascal过程添加一些行。
我已经翻译了前两章,每章作为一个包,每个Pascal过程作为JAVA中的静态保护方法,一章的过程被收集在一个类中,扩展了从其先前章节翻译的类。
package td1;
public class Cradle {
protected final static char TAB='\t';
protected static char look;
protected static void getChar() throws IOException {
look=(char) System.in.read();
}
...
}
package td2;
public class Cradle extends td1.Cradle{
protected static void factor() throws IOException {
...
}
...
}
然而,当我来到td3时,我必须更新td2.Cradle的factor(),但我不想在td2中更改.Cradle factor(),因为这会使因子()在td2中比在td2中应该提供的更多。我想到了“扩展”td2.Cradle(),但是,扩展静态类似乎是不可能的。
我是否应该将每个静态方法更改为非静态方法?
我当然需要一些设计模式,任何人都可以提供帮助吗?我希望我很清楚。总之,这个项目逐步为每个过程提供越来越多的指令,我希望使用一些JAVA机制(如继承)记录中间步骤。
Pascal代码是经典书籍LBC。我觉得尝试使用继承,因为
我的实际解决方案是将tp1.Cradle的方法保持为静态。 tp2.Cradle,tp3.Cradle,...中的方法,直到tp15.Cradle将是非静态的,并且它们都静态导入 tp1.Cradle。*。此外,对于大于2的每个整数,tp [i] .Cradle 扩展 tp [i-1] .Cradle。
不要犹豫,告诉我更好的解决方案。
答案 0 :(得分:1)
听起来你走在正确的轨道上。为了能够覆盖这些方法,它们应该是实例方法。因此,您应该从依赖于这些“全局方法”的模型转移到基于实例的模型,在该模型中,您可以创建Cradle类的实例并在该实例上调用相应的方法。