Я хотел бы определить черту с некоторыми свойствами, которые имеют четко определенные отношения - например, скажем, a * b = c
.Идея состоит в том, что реализации этой черты могут предоставить два из них и иметь аксессор для третьего свойства, полученного автоматически.
( Это та же особенность, что и у классов типов Haskell, если я правильно их помнюгде, если бы вы определили <
из Ord
, >=
будет реализовано как ! . <
- хотя вы можете определить любое подмножество функций, если можно сделать вывод об остальном.) (я непомните классы типов в Haskell правильно.)
Наивный подход на самом деле работает довольно хорошо:
trait Foo {
// a * b = c
def a: Double = c / b
def b: Double = c / a
def c: Double = a * b
}
class FooOne(override val a: Double, override val b: Double) extends Foo
class FooTwo(override val a: Double, override val c: Double) extends Foo
Здесь реализации FooOne
и FooTwo
являются полными реализациями Foo
и ведут себякак и ожидалось.Все идет нормально;этот подход позволяет классам определять два свойства и получать третье «бесплатно».
Однако все начинает выглядеть менее радужно, если определить третий класс:
class FooFail(override val a: Double) extends Foo
Это компилируется просто отлично - однако, это вызовет переполнение стека, если его методы b
или c
когда-либо будут оценены.
Таким образом, наивный подход дает вывод аспект подхода класса типов в Haskell, но у нас нет безопасности во время компиляции.Что бы я хотел, чтобы компилятор жаловался, если для реализации классов определены менее двух методов.Очевидно, что текущий синтаксис здесь недостаточен;нам нужно, чтобы методы считались абстрактными, хотя и с реализацией по умолчанию, которую можно использовать тогда и только тогда, когда зависимые методы неабстрактны.
Предоставляет ли Scala соответствующую семантику для определения этого?(У меня нет проблемы, если есть какой-то окольный способ его определения, подобный типам объединения , поскольку я не знаю никакой первоклассной поддержки этого в языке).
Если нет, я справлюсь с наивным подходом и просто тщательно определю и протестирую свои занятия.Но я действительно думаю, что это система, которая должна улавливать систему типов (в конце концов, это не Ruby.:)).