Я только начинаю работать со Scala и работаю над некоторыми учебниками. Я наткнулся на объект-компаньон и использовал его как фабрику. Я попробовал несколько вещей. Однако я не заставляю следующее работать должным образом. Не могу уложиться в голове..
import math._
abstract class Point{
// ...
}
object Point{
private class PointInt(val x:Int,val y:Int) extends Point{
def +(that:PointInt) = new PointInt(this.x + that.x, this.y + that.y)
def distance(that:PointInt) =
sqrt(pow((this.x - that.x), 2) + pow((this.y - that.y), 2))
}
private class PointDouble(val x:Double,val y:Double) extends Point{
def +(that:PointDouble) = new PointDouble(this.x + that.x, this.y + that.y)
def distance(that:PointDouble) =
sqrt(pow((this.x - that.x), 2) + pow((this.y - that.y), 2))
}
def apply(x:Int,y:Int):Point = new PointInt(x,y)
def apply(x:Double,y:Double):Point = new PointDouble(x,y)
}
val a = Point(1,2)
val b = Point(3,4)
val c = a+b // does not work...
Просто пытаюсь сложить две целые точки, как я определил в методах... Кто-нибудь знает, что я делаю неправильно??
EDIT: я пытался обернуть следующий (рабочий) класс в Factory.
class Point(val x:Int,val y:Int){
def +(that:Point) = new Point(this.x + that.x, this.y + that.y)
def distance(that:Point) = sqrt(pow((this.x - that.x),2) + pow((this.y - that.y),2))
}
val a = new Point(1,2) //> a : week1.OU2.Point = week1.OU2$Point@73e48fa7
val b = new Point(3,4) //> b : week1.OU2.Point = week1.OU2$Point@677bb8fe
val c = a+b //> c : week1.OU2.Point = week1.OU2$Point@6bae60c5
c.x //> res0: Int = 4
c.y //> res1: Int = 6
a
взять метод+
? Все, что он знает, это то, что он имеет типPoint
. Он не знает, что это на самом делеPointInt
— вот что означает возвращаемый типPoint
! Вы хотели добавить метод+
кPoint
? - person Rex Kerr   schedule 02.06.2013+
должен был бы приниматьPoint
, а не подклассPoint
, если вы хотите передатьPointInt
вPointDouble
. - person Boris the Spider   schedule 02.06.2013def apply(...): Point =
, то этот тип будет виден с сайта вызова, даже если возвращаемое значение на самом деле является подтипомPoint
. Сайт вызова не видит дальше: Point =
, поэтому понятия не имеет, что у вас естьPointInt
с методом+
. - person 0__   schedule 03.06.2013PointInt
иPointDouble
равныprivate
. - person Viktor Seifert   schedule 03.06.2013