Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.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
Design patterns 几何体类型层次结构的整洁设计模式_Design Patterns_Scala_Geometry - Fatal编程技术网

Design patterns 几何体类型层次结构的整洁设计模式

Design patterns 几何体类型层次结构的整洁设计模式,design-patterns,scala,geometry,Design Patterns,Scala,Geometry,我正在寻找一种简洁的方法来为我的几何图形集实现一个很酷的设计模式。现在,我在几何体类型层次结构的顶部有一个称为Geometry的特性。其思想是让每个几何体继承特性,然后为特定类型的几何体实现特定代码。当然,作为几何对象,这些几何需要实现各种方法。以计算到任何其他几何体的距离为例,我将其称为distanceTo。最干净的方法必须是在几何体特性中有一个方法,如下所示: def distanceTo(geometry : Geometry) : Double 我的问题是:如何在一个几何体(比如一个矩

我正在寻找一种简洁的方法来为我的几何图形集实现一个很酷的设计模式。现在,我在几何体类型层次结构的顶部有一个称为
Geometry
的特性。其思想是让每个几何体继承特性,然后为特定类型的几何体实现特定代码。当然,作为几何对象,这些几何需要实现各种方法。以计算到任何其他几何体的距离为例,我将其称为
distanceTo
。最干净的方法必须是在
几何体
特性中有一个方法,如下所示:

def distanceTo(geometry : Geometry) : Double
我的问题是:如何在一个几何体(比如一个
矩形
)中实现这个方法,而不必为存在的每个形状键入check?有没有简便的方法将请求委托给各个几何体

干杯,

既然Scala没有,你最好的选择就是对几何对象进行模式匹配。差不多

(geo1, geo2) match {
  case (Rectangle(x1,y1,w1,h1), Rectangle(x2,y2,w2,h2)) => ....
  ...
}

然后,您可以在调用此方法的
几何体
特征上定义一个方便的方法。如果
Geometry
是一个密封的特性,编译器甚至会在模式匹配时警告您缺少案例。

您可能需要查找“双重分派”和“访问者模式”。这些事情并不能使您免于实现N^2左右的函数变体,它们只是使工作变得更容易,并让您以更有组织的方式来完成。在Java这样的语言中,双重分派和访问者模式是一种很好的方法,它们缺少(语言级别)多重分派和模式匹配。但是访问者模式非常麻烦,需要很多样板代码。我本来希望有更好的解决方案,但我想我还是坚持使用N^2变体。谢谢你的回复!别忘了使用递归来去除一半的情况。仅为(矩形、圆形)编写代码,并使上述匹配中的最后一个大小写表示
case(a,b)=>distance(b,a)
,假设函数名为distance。(圆形,矩形)然后为您处理。@Bart:这是个坏主意,因为如果您错过了一个组合,它将进入一个无限循环。实现相同效果的更好方法是首先按形状的类型对这一对进行排序。