2010-12-13 12 views

回答

0

我去沿着這些路線的解決方案:

//---------- Classes without needed behavior 
case class Point(x: Double, y: Double) 
trait Shape {} 
case class Circle(center: Point, radius: Double) extends Shape {} 
case class Rectangle(lowerLeft: Point, upperRight: Point) extends Shape {} 


val circle = Circle(Point(1.0, 2.0), 5.0) 
val rectangle = Rectangle(Point(-2.0, -1.0), Point(4.0, 5.0)) 


//----------- Support for new behavior I want to add 

// Create exception to handle non supported subclasses 
case class NewMethodNotSupported(a: Any) 
    extends RuntimeException(a.toString + ".newMethod() not supported") 

class NewBehavior(shape: Shape) { 
    def newMethod() = shape match { 
     case c: Circle => doMethod(c) 
     case r: Rectangle => doMethod(r) 
     case _ => throw NewMethodNotSupported(shape) 
    } 
    private 
    def doMethod(s: Shape) = println(s) // print to standard out. 
} 

object NewBehavior { 
    // invoked by the compiler 
    implicit def shapeToNewBehavior(s: Shape) = new NewBehavior(s) 
} 

// bring the implicit method in scope 
import NewBehavior._ 
// --------- End of new behavior support   


// Test behavior support: 
println("Test that new behavior is added:") 
circle.newMethod() 
rectangle.newMethod() 

// Create a non supported shape class 
case class Triangle(vertex1: Point, 
     vertex2: Point, vertex3: Point) extends Shape {} 

val triangle = Triangle(Point(-1.0,0.0), Point(1.0,0.0), Point(0.0,1.0)) 

// Catch exception thrown by trying to call method from unsupported shape 
try{  
    println("\nTest method call from unsupported shape:") 
    triangle.newMethod() 
} catch { 
    case dns: NewMethodNotSupported => println(dns); System.exit(-1) 
    case unknown => println("Uknown exception " + unknown); System.exit(-1) 
} 
+0

這不符合類型模式。 – 2010-12-15 10:47:50

2

我想你可以做這樣的事情:

def max[A](list: List[A])(implicit ord: Ordering[A]): A = { 
    list.tail.foldLeft(list.head) ((a, b) => if (ord.lt(a, b)) b else a) 
} 

implicit def toOrdering[A <% Ordered[A]]: Ordering[A] = new Ordering[A] { 
    def compare(a: A, b: A): Int = (a < b, b < a) match { 
     case (true, _) => -1 
     case (_, true) => 1 
     case _ => 0 
    } 
} 

println(max(List(1, 2, 3, 2, 1))) 

的代碼運行在兩斯卡拉2.7.7和2.8.0(經測試,現在在這兩個),儘管隱含的定義是不必要的(和在某些情況下可能有害)在Scala 2.8中。

+0

我目前並不熟悉查看邊界,所以我無法弄清楚如何工作,你的解決方案,但我想通了,該怎麼辦呢其他方式。 – klactose 2010-12-15 06:46:53