Принудительно несовместимы черты Scala - PullRequest
4 голосов
/ 28 июня 2019

Есть ли способ предотвратить смешивание двух признаков в одном классе?

Я знаю, что вы можете использовать аннотации типа себя, чтобы требовать, чтобы свойство смешивалось только в классе определенного типа, ноМожете ли вы использовать аналогичную конструкцию, чтобы требовать, чтобы целевой класс НЕ смешивался с определенной чертой?

Например:

abstract class Collector(p: Boolean)

trait Cache

trait ACache extends Cache { self: Collector => }

trait BCache extends Cache { self: Collector => }

Могу ли я требовать, чтобы любая реализация Collector смешивалась в ACache, BCache, или нет никаких признаков кэша, но не ACache и BCache одновременно?

class GoodCollector(p: Boolean) extends Collector(p) with ACache //legal
class BadCollector(p: Boolean) extends Collector(p) with ACache with BCache //illegal

1 Ответ

7 голосов
/ 28 июня 2019

Если вы измените Cache следующим образом:

trait Cache[A <: Cache[_]]

trait ACache extends Cache[ACache] { self: Collector =>
}

trait BCache extends Cache[BCache] { self: Collector =>
}

тогда:

class BadCollector(p: Boolean) extends Collector(p) with ACache with BCache 

потерпит неудачу с:

незаконное наследование; Класс BadCollector наследует различные экземпляры типа Cache: Кэш [BCache] и Кэш [ACache] Класс BadCollector (p: Boolean) расширяет Collector (p) с помощью ACache с BCache

...