2013-09-11 3 views
1

Я застреваю с «простой» проблемой. Я работаю с метаданными файлов. Я хотел бы предоставить как просмотр только для чтения (trait ReadOnly) с помощью только геттеров, так и представление чтения-записи (trait ReadWrite) с геттерами и сеттерами. Каждое представление с чтением и записью должно распространяться на просмотр только для чтения.Расширение общего типа

trait ReadOnly 

trait ReadWrite 

trait BasicRO extends ReadOnly { 
    def foo: String 
    def bar: Int 
} 

class BasicRW extends ReadWrite with BasicRO { 
    def foo: String = ??? 
    def foo_=(str: String): Unit = ??? 
    def bar: Int = ??? 
    def bar_=(i: Int): Unit = ??? 
} 

Пока все хорошо. Но теперь я хотел бы добавить метод snapshot к ReadWrite, который вернет соответствующий вид ReadOnly (тот же, что был расширен подклассом ReadWrite). В псевдо- лестницу, я хотел бы определить это ограничение, как:

trait ReadWrite[T <: ReadOnly] extends T { 
    def snaphsot: T 
} 

Но это не компилируется, потому что class type required but T found (сообщение компилятора). Есть ли способ выразить это ограничение в системе типов Scala?

ответ

4

Для того, чтобы быть четким, вы хотите, чтобы снимок был отдельным признаком, но его можно использовать только в классе, который также расширяет ReadOnly?

Вы можете использовать тип самостоятельного для этого

trait ReadOnly[T] 

trait ReadWrite[T] { self: ReadOnly[T] => 
    def snapshot: T 
} 

trait BasicRO[T] extends ReadOnly[T] { 
    def foo: String 
    def bar: Int 
} 

abstract class class1[T] extends ReadOnly[T] with ReadWrite[T] // legal 

abstract class class2[T] extends ReadWrite[T] // Not legal 

abstract class class3[T] extends BasicRO[T] with ReadWrite[T] // legal 

Это не делает ReadWrite продлить ReadOnly, но и требует, чтобы базовый объект также смешать в ReadOnly (с тем же параметром типа) и дает ReadWrite доступ к методам ReadOnly, позволяя подклассифицировать две черты полностью независимо друг от друга.

+0

Вы частично правы относительно моего ответа (который я сейчас удалил). Я проверил его в REPL, и, похоже, он работал нормально, но более обширная проверка показала, что я неправильно истолковал вывод. – Shadowlands

+0

Хорошо, я удалю ссылку на удаленное решение – itsbruce

+0

Спасибо. Добавляем к вашему решению ограничение 'trait ReadOnly [T <: ReadOnly [T]]', трюк, который я ищу. – paradigmatic

Смежные вопросы