Tôi có một lớp cơ sở trừu tượng (Base
) có một số đặc điểm xếp chồng được xác định cho nó (StackingTrait
).Scala: Trait Mixin với Lớp cơ sở trừu tượng
trait Base {
def foo
}
trait StackingTrait extends Base {
abstract override def foo { super.foo }
}
Nó sẽ rất thuận tiện để thực hiện một lớp con bằng cách sử dụng cú pháp sau, nhưng điều này không làm việc vì trình biên dịch nói rằng foo cần phải được khai báo với override
và sau đó với abstract override
trên biên dịch lại, đó là không hợp lệ vì Impl
là một lớp học.
class Impl extends Base with StackingTrait {
def foo {}
}
Tôi không thể nghĩ ra lý do chính đáng tại sao cú pháp này sẽ không được phép; foo được xác định hợp lý với Impl
để sắp xếp thứ tự xếp chồng xảy ra trong khái niệm vẫn giữ nguyên.
Lưu ý: Tôi đã tìm ra cách giải quyết này có hiệu quả làm điều tương tự mà tôi muốn, nhưng sự cần thiết của lớp trợ giúp làm cho tôi muốn có giải pháp tốt hơn.
class ImplHelper extends Base {
def foo {}
}
class Impl extends ImplHelper with StackingTrait
Tại sao cú pháp mong muốn không biên dịch và có giải pháp thanh lịch?
Câu trả lời hay! Tôi chuẩn bị đăng câu hỏi về tình huống này. Cảm ơn! –
Tôi vừa gặp sự cố này. Sự tuyến tính hóa cuối cùng là đúng về điều này nhưng tôi nhận ra mục đích thế giới thực của các đặc điểm xếp chồng là: Bạn có thể thực hiện một sửa đổi với một đặc điểm xếp chồng chỉ cho việc thực hiện cụ thể lớp trừu tượng/đặc điểm chung. I E. có một 'danh sách lớp trừu tượng' và một danh sách mở rộng của mô-đun« trait ». Bạn không thể chỉ viết 'class Foo extends List với Mod'. Đầu tiên, bạn phải có một List cụ thể, như 'class LinkedList extends List', sau đó bạn có thể viết' class Bar mở rộng LinkedList với Mod'. Hy vọng rằng có ý nghĩa. –
Tôi quên thêm rằng điều này chỉ liên quan đến các đặc điểm với các phương thức 'tóm tắt trừu tượng', phải rõ ràng. Không có các phương pháp như vậy, dường như các đặc điểm có thể được trộn lẫn một cách tự do. –