Trước tiên, tại sao bạn lại thấy một số MatchError
. Một giá trị trên một đối tượng (A.f) được coi là một định danh ổn định (như tham chiếu Scala nói, "Thành viên ổn định là [...] thành viên được giới thiệu bởi các đối tượng hoặc định nghĩa giá trị của các loại không bay hơi").
Đây là những gì đầu ra typer trông giống như:
object A extends scala.AnyRef {
...
private[this] val f: String = "Object A";
<stable> <accessor> def f: String = A.this.f
}
Khi được sử dụng trong một bài tập, trình biên dịch "desugars" giao nhận dạng ổn định này (nó là ổn định là một điều kiện cần thiết) vào mô hình kết hợp:
<synthetic> private[this] val x$1: Unit = ("Object B": String("Object B") @unchecked) match {
case A.f =>()
}
Không thể đối sánh "Đối tượng B" với mẫu "Đối tượng A", vì vậy nó ném một số MatchError
.
Để câu hỏi lớn hơn của bạn: bạn không thể/không nên ghi đè các giá trị và phương pháp trên đối tượng đồng hành. Tính đa hình áp dụng cho các lớp và các thể hiện của chúng, không áp dụng cho các phương thức hoặc giá trị tĩnh. Có lẽ một cách tốt hơn để suy nghĩ về chương trình của bạn mà không liên quan đến trọng số ghi đè/defs trên một đối tượng đồng hành.
Nguồn
2013-04-30 19:25:52
Cảm ơn bạn đã làm rõ! Tôi đồng ý với bạn về nhu cầu ghi đè đối tượng đồng hành nói chung, nhưng lý do tôi muốn làm ở đây là dành cho mục đích thử nghiệm, nơi tôi muốn thay thế một phương thức bên trong đối tượng đồng hành bằng một phương pháp khác. Ngoài ra, một số ngôn ngữ cho phép ghi đè các phương pháp tĩnh. – deepkimo