Giả sử tôi có một lớp cơ sởđặc điểm và các loại trừu tượng
abstract class Base {
type B<: Base
def rep:String
def copy:B
}
class MyBase(override val rep:String) extends Base {
type B = MyBase
override def copy = new MyBase(rep)
}
sau đó tôi cố gắng thêm đặc điểm khác như một mixin, mà tôi muốn các kiểu trả về cho bản sao là loại thích hợp (nghĩa là gọi sao chép trên mixin trả về một loại mixin, bằng cách đặt B cho loại thích hợp). Tôi đã không thể có được điều này để biên dịch, hoặc thậm chí để hiểu nơi mà các từ khóa ghi đè nên đi.
được sửa đổi: Tôi đã tinh chế ví dụ
abstract class Base {
type B <: Base
def rep:String
def copy:B
}
class MyBase(val rep:String) extends Base {
type B = MyBase
def copy = new MyBase(rep)
}
trait DecBase extends Base {
abstract override def rep = "Rep: "+super.rep
}
Câu hỏi của tôi là, làm thế nào để khai báo một loại B thích hợp và sao chép phương pháp DecBase, do đó các bản sao trả về một DecBase, và cũng có thể, tại sao thắng' t biên dịch này?
println(((new MyBase("ofer") with DecBase)).rep)
Đây là điều tôi đã đạt được trong Java (với một số sự khó chịu, sử dụng các loại chung đệ quy). Tôi chắc chắn rằng nó có thể làm điều gì đó đẹp hơn ở Scala.
Sửa
Sử dụng
trait DecBase extends Base {
override type B = DecBase
abstract override val rep= "Dec:"+super.rep
abstract override def copy = new MyBase(rep) with DecBase
}
tôi nhận được các lỗi biên dịch sau
error: overriding type B in class MyBase, which equals com.amadesa.scripts.MyBase;
type B in trait DecBase, which equals com.amadesa.scripts.DecBase has incompatible type
println(((new MyBase("ofer") with DecBase)).rep)
error: overriding type B in class MyBase, which equals com.amadesa.scripts.MyBase;
type B in trait DecBase, which equals com.amadesa.scripts.DecBase has incompatible type
abstract override def copy = new MyBase(rep) with DecBase
Tôi đã tinh chỉnh câu hỏi. – user44242
Đã chỉnh sửa lại, thêm lỗi trình biên dịch lần này. Điều quan trọng đối với tôi là kiểu trả về đúng cho phương thức sao chép. – user44242
Hiện tại tôi đang gặp sự cố khi hoạt động. Để bắt đầu, bạn không thể ghi đè B thành DecBase vì DecBase không phải là kiểu con của MyBase. Nhưng sau khi sửa xong, tôi vẫn gặp lỗi. Trình biên dịch dường như không thích loại B = MyBase, nhưng nó có thể khác. – sblundy