Java-如何确定类层次结构?
我最近正在研究Java继承如何工作的层次结构设计。但我不确定应该从哪一点开始 给出一个计算二进制表达式的示例,它必须使用两个类Java-如何确定类层次结构?,java,inheritance,Java,Inheritance,我最近正在研究Java继承如何工作的层次结构设计。但我不确定应该从哪一点开始 给出一个计算二进制表达式的示例,它必须使用两个类Literal和binary。但它建议给出以下示例输出: Literal a = new Literal(6); Literal b = new Literal(12); System.out.println(b); //Prints out: 12.0 System.out.println(b.evaluate()); //Prints ou
Literal
和binary
。但它建议给出以下示例输出:
Literal a = new Literal(6);
Literal b = new Literal(12);
System.out.println(b); //Prints out: 12.0
System.out.println(b.evaluate()); //Prints out: 12.0
Binary e = new Binary(b, a, Operation.DIVIDE);
System.out.println(e); //Prints out: 12.0 / 6.0
Binary f = new Binary(e, a, Operation.PLUS);
System.out.println(f); //Prints out: (12.0 / 6.0) + 6.0
System.out.println(f.evaluate()); //Prints out: 8.0
Binary g = new Binary(e, f, Operation.TIMES);
System.out.println(g.evaluate()); //Prints out: 16.0
*操作
是一个枚举,它定义了四个加、减、乘和除操作
我试图设计一个Literal
类和另一个从类Literal
扩展而来的类Binary
。。。但我发现,以下输出的后续要求可能有问题…:
Variable v = new Variable(“a“);
Expression n = new Binary(f, v, Operation.DIVIDE);
System.out.println(n); //Prints out: ((12.0 / 6.0) + 6.0) / a
Environment x = new Environment();
x.addVariable(“a“, 4.0); //Variable “a“ has a value 4.0 in x
System.out.println(n.evaluate()); //RuntimeException
System.out.println(n.evaluate(x)); //Prints out: 2.0 (8.0 / 4.0 = 2.0)
我发现类
二进制
必须从表达式
扩展以满足要求。。。实际上,我的设计开始时我错了吗? 如果你可以把类的对象描述为代码< b>代码>作为类<代码> a < <代码>,你应该考虑继承。然后类B
应该扩展类B
另一方面,类之间的直接继承可能会导致一些棘手的问题,因此最好通过接口表达“is a”关系,并使classBImpl
classa
的属性将继承的调用委托给:
interface A{
void someMethod();
}
interface B extends A{
void someOtherMethod();
}
class C implements A {
void someMethod(){}
}
class D implements B {
private A a;
D(A a){
this.a=a;
}
void someMethod(){
a.someMethod()
}
void someOtherMethod(){}
}
从您上次的评论中,问题变得很清楚: 但是变量
f
被定义为Binary
,并且在构造函数中它可能具有类型Literal
或Binary
如果Literal
和Binary
都扩展Expression
,则构造函数可以获取2个Expression
参数,这意味着Literal
和Binary
都是可以接受的:
interface Expression {...}
class Literal implements Expression {...}
class Binary implements Expression {
...
public Binary(Expression lhs, Expression rhs, Operation op) {
...
}
...
}
为什么
Binary
会扩展Literal
?我希望它们都能实现Expression
。表达式解析是应用复合设计模式的完美选择:@jornverne,因为变量f
是用Literal
类型的对象定义的。。。很抱歉我可能会误解概念…@null它说Binary f=newbinary(…)代码>第二个代码段似乎也有输入错误,其中表达式n=新表达式(f,v,Operation.DIVIDE)代码>应该是:表达式n=新二进制(f,v,Operation.DIVIDE)代码>@jornverne哦!是的,这是一个打字错误,现在更正。。。但是变量f
被定义为Binary
,并且在构造函数中它可能具有类型Literal
或Binary
。。。但如果只是考虑到以前的要求,我不确定如何修复…?是的,谢谢,这就是我对后续要求的看法。但是在第一个需求中,第一个阶段(上层块)只有两个类:二进制类和文本类。。。类表达式用于第二个阶段(下块),因为需求分为两部分…@null,但没有人说您不能做更多。。。正确的?