Проблема реализации Summable
Я пытаюсь реализовать классы DistanceCM
а также DistanceMM
и я хочу, чтобы они были суммируемыми взаимозаменяемо, пока они оба наследуют от Distance
,
Тем не менее, я получаю эту ошибку:
"Ошибка:(46, 76) ceylon: параметр типа" Other "объявления" Summable "имеет аргумент" Distance ", который нельзя назначить верхней границе" Summable "значения" Other ""
... который я не могу расшифровать... Сообщение об ошибке относится к этой строке в коде ниже:
shared actual Distance plus(Distance other)
Это текущий код:
abstract class Distance() of DistanceMM | DistanceCM {
shared formal Distance multiplyScalar(Float scalar);
}
class DistanceMM(variable Float val) extends Distance() satisfies Summable<Distance>
{
shared Float distanceInMillimeters;
shared Float distanceInCentimeters;
switch (unit)
case (millimeter) {
distanceInMillimeters => val;
distanceInCentimeters => val / 10;
}
case (centimeter) {
distanceInMillimeters => val * 10;
distanceInCentimeters => val;
}
shared actual DistanceMM multiplyScalar(Float scalar) {
val = val * scalar;
return this;
}
shared actual Distance plus(Distance other) {
switch (other)
case (DistanceMM) {
return DistanceMM(val + other.distanceInMillimeters(), unit);
}
case (DistanceCM) {
return DistanceMM(val + other.distanceInCentimeters(), unit);
}
}
}
class DistanceCM(variable Float val) extends Distance() satisfies Summable<Distance>
{
shared Float distanceInMillimeters;
shared Float distanceInCentimeters;
switch (unit)
case (millimeter) {
distanceInMillimeters => val;
distanceInCentimeters => val / 10;
}
case (centimeter) {
distanceInMillimeters => val * 10;
distanceInCentimeters => val;
}
shared actual DistanceCM multiplyScalar(Float scalar) {
val = val * scalar;
return this;
}
// implementation missing
}
1 ответ
Решение
interface Summable<Other> of Other given Other satisfies Summable<Other>
Обратите внимание на ограничение (given
пункт). Вы утверждаете, что DistanceMM
удовлетворяет Summable<Distance>
, но Distance
не удовлетворяет ограничения на Other
(Distance
не удовлетворяет Summable<Distance>
). Попробуй это:
interface Distance of Centimeter | Millimeter satisfies Summable<Distance> {}
class Centimeter() satisfies Distance {
shared actual Distance plus(Distance other) => nothing;
}
class Millimeter() satisfies Distance {
shared actual Distance plus(Distance other) => nothing;
}