Oop 扩展泛型类型

Oop 扩展泛型类型,oop,scala,type-systems,Oop,Scala,Type Systems,我遇到了一个“简单”的问题。我正在处理文件元数据。我想提供一个只读视图(trait ReadOnly)和一个读写视图(trait ReadWrite)以及getter和setter。每个读写视图必须扩展只读视图 trait ReadOnly trait ReadWrite trait BasicRO extends ReadOnly { def foo: String def bar: Int } class BasicRW extends ReadWrite with Basi

我遇到了一个“简单”的问题。我正在处理文件元数据。我想提供一个只读视图(
trait ReadOnly
)和一个读写视图(
trait ReadWrite
)以及getter和setter。每个读写视图必须扩展只读视图

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 = ???
}
到目前为止还不错。但是现在,我想在
ReadWrite
中添加一个
snapshot
方法,它将返回相应的
ReadOnly
视图(与
ReadWrite
子类扩展的视图相同)。在pseudo scala中,我想将此约束定义为:

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

trait ReadWrite[T需要明确的是,您希望快照位于单独的trait中,但它只能用于同时扩展ReadOnly的类

您可以为此使用self类型

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
的方法,同时允许将这两个特性完全独立地子类化。

请澄清,您希望快照位于单独的特性中,但它只能用于同时扩展ReadOnly的类中

您可以为此使用self类型

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
的方法,同时允许将这两个特征完全独立地进行子分类。

关于我的答案(我现在已经删除了该答案),您的回答部分正确-我确实在REPL中检查了它,它似乎在那里工作得很好,但更广泛的检查表明我误解了输出。好的,我将删除对已删除解决方案的引用谢谢。添加约束
trait ReadOnly[T@itsbrough,因为
snapshot
返回的类型
T
也必须是
ReadOnly
。另一种方法是更改
snapshot
签名以返回
ReadOnly[T]
而不是
T
。哦,你在这里混淆了两个不同的东西。我想知道,在你的问题中,为什么ReadWrite是泛型的,而其他类和特征不是。泛型不是这样工作的。你不能以这种方式将ReadWrite[T]混合到ReadOnly的子类中-即[T]不是指特质中的班级混合。关于我的答案(我现在已经删除了),你部分是对的-我确实在REPL中检查了它,它似乎在那里工作得很好,但更广泛的检查表明我误解了输出。好的,我将删除对已删除解决方案的引用谢谢。添加约束
trait ReadOnly[T@itsbrough,因为
snapshot
返回的类型
T
也必须是
ReadOnly
。另一种方法是更改
snapshot
签名以返回
ReadOnly[T]
而不是
T
。哦,你在这里混淆了两个不同的东西。我想知道,在你的问题中,为什么ReadWrite是泛型的,而其他类和trait不是。泛型不是这样工作的。你不能以这种方式将ReadWrite[T]混合到ReadOnly的子类中,即[T]不指在trait中混合的类。