2011-11-24 79 views
2

我正在寻找一种整洁的方式来为我的几何集合实现一个很酷的设计模式。现在我的几何类型层次结构的顶部有一个名为Geometry的特征。这个想法是让每个几何都继承特征,然后为特定类型的几何实现特定的代码。作为几何对象,这些几何图形当然需要实现各种方法。举例来说,计算到任何其他几何体的距离的能力 - 我称之为distanceTo。最干净的方式做到这一点必须有在Geometry性状的方法,像这样:几何类型层次结构的整洁设计模式

def distanceTo(geometry : Geometry) : Double 

我的问题是这样的:我如何不必键入实现几何此方法(比如一个Rectangle) - 检查存在的每个形状?是否有任何方便的方法将请求委托给各个几何体?

干杯,

+1

您可能需要查看“双派”和“访客模式”。这些东西并不能让你实现N^2或者你的函数变体的需要,他们只是让工作变得更容易,让你以更有组织的方式去做。 –

+0

双派遣和访问者模式是在像Java这样的语言中完成的一种好方法,它缺少(语言级别)多派遣*和*模式匹配。但访问者模式非常繁琐,需要大量的样板代码。 –

回答

2

由于Scala没有multiple dispatch,最好的办法是图案对几何对象的匹配。像

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

东西,你可以再定义的Geometry特点调用此方法的简便方法。如果Geometry是密码特征,那么编译器甚至会在模式匹配时警告您丢失了个案。

+0

是的,这是我的想法。我曾希望有更好的解决方案,但我认为我会坚持使用N^2变体。感谢您的回复! –

+0

不要忘记使用递归来削减一半的情况。只要写出(Rectangle,Circle)的代码,并在上面的匹配中说出'case(a,b)=> distance(b,a)',假设该函数被称为距离。 (圆形,矩形)然后为您处理。 –

+0

@Bart:这是一个糟糕的主意,因为如果你错过了一个组合,它将陷入无限循环。达到相同效果的一个更好的想法是首先根据形状的类型对这一对进行分类。 –