Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-如何确定类层次结构?_Java_Inheritance - Fatal编程技术网

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

我最近正在研究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 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”关系,并使class
BImpl
class
a
的属性将继承的调用委托给:

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,但没有人说您不能做更多。。。正确的?