2010-01-13 14 views
9

Có cách nào tốt hơn để thực hiện việc này không?Trường hợp Scala có nguồn gốc có cùng biến thành viên làm cơ sở

scala> case class A(x : Int) 
defined class A 

scala> case class B(override val x : Int, y : Int) extends A(x) 
defined class B 

Tôi đang mở rộng A bằng B và thêm biến thành viên bổ sung. Nó sẽ được tốt đẹp không phải viết override val trước khi x.

+0

Ví dụ này trông giống như tôi là một chút cầu kỳ nhưng nếu lớp cơ sở có rất nhiều các biến thành viên tất cả các 'def's override bắt đầu để thêm lên. – Dave

+0

Vâng, theo như tôi biết, các trường hợp hoạt động như thế. – F0RR

Trả lời

14

Tôi đặc biệt khuyên không nên kế thừa từ một lớp chữ thường. Nó có các hiệu ứng đáng ngạc nhiên trên equals và hashCode, và đã không được chấp nhận trong Scala 2.8.

Thay vào đó, hãy xác định x trong một đặc điểm hoặc một lớp trừu tượng.

scala> trait A { val x: Int } 
defined trait A 

scala> case class B(val x: Int, y: Int) extends A 
defined class B 

http://www.scala-lang.org/node/3289

http://www.scala-lang.org/node/1582

+0

Trên 2,8, tôi thấy không có gì đáng ngạc nhiên về equals/hashCode. Tất cả các thuộc tính bắt buộc của bằng đều được duy trì theo cách trực quan nhất. (Các cá thể với kiểu thời gian chạy của 'trường hợp lớp A' không bao giờ bằng với các cá thể của' trường hợp lớp B', bất kể nếu có thừa kế liên quan). –

+12

Để được chính xác, trường hợp các lớp học không nên kế thừa từ các trường hợp lớp học khác. It's OK (và khá phổ biến) để cho một lớp bình thường kế thừa từ một lớp trường hợp. –

+0

Vì vậy, điều đó có nghĩa là nếu bạn viết các trường hợp bạn đang niêm phong hiệu quả các lớp đó. Đó là một tác dụng phụ mà tôi không mong đợi nhưng tôi sẽ cẩn thận trong tương lai. – Dave

Các vấn đề liên quan