Ok, điều này là khó khăn. Câu hỏi của bạn: "Vậy tại sao Scala không chỉ đơn giản là cấm sự kết hợp của modifiers private final?" được dựa trên giả định rằng sự kết hợp này không sử dụng.
Giả sử bạn đúng (và bạn đang có, ngoại trừ một chi tiết nhỏ, sẽ được đề cập sau). Tôi không phải là một anh chàng biên dịch, nhưng từ quan điểm của tôi "chỉ đơn giản là cấm" có lẽ không đơn giản chút nào (ít nhất là trong trường hợp này). Và tại sao một người nào đó sẽ cố gắng làm điều đó? Thương mại là gì? Chỉ vì cái gì đó không hữu ích không nhất thiết có nghĩa là nó gây hại. Chỉ cần không sử dụng nó ...
Bây giờ ở đây có các chi tiết nhỏ mà bạn dường như đã bỏ qua. Sửa đổi private
là công cụ sửa đổi hiển thị, có nghĩa là class B
không biết về sự tồn tại của nó. Nhưng các công cụ sửa đổi khả năng hiển thị của Scala phức tạp hơn một chút so với Java. Giả sử rằng vì bất kỳ lý do gì bạn sẽ yêu cầu mã được hiển thị trong đoạn mã sau, trình biên dịch sẽ không cho phép nó.
package scope
class A {
def callFoo = foo;
private[scope] final def foo = "bar of A"
}
class B extends A {
private[scope] final def foo = "bar of B"
}
object Main extends App {
println((new A()).callFoo)
println((new B()).callFoo)
}
Đây là một trong các lỗi được cung cấp bởi trình biên dịch: "phương pháp foo không thể ghi đè thành viên cuối cùng".
Vì vậy, thông tin cho bạn đây. Scala chỉ đơn giản là cấm sự kết hợp này;)
Tôi không nghĩ về phạm vi bổ sung mà công cụ sửa đổi có thể có. Bạn nói đúng, có định nghĩa riêng tư của gói, 'final' cấm ghi đè nó. Trong trường hợp này nó có một sử dụng. Nhưng nếu không tôi nghĩ rằng một ngôn ngữ xây dựng mà không có hiệu lực không phải là hợp pháp. Ở đây, nếu 'final' không ngăn các lớp con hoặc các đặc điểm ghi đè định nghĩa hơn thì nó không được sử dụng trong một khai báo. –
@Tim lý do 'cuối cùng' không ngăn các lớp con/đặc điểm ghi đè định nghĩa là do' riêng tư' đã ngăn chặn điều đó. Thành viên 'private' không hiển thị với các lớp con nên không có gì để ghi đè lên. Đối với điều này là một vấn đề, bạn lập trình viên sẽ phải thực hiện hai lỗi riêng biệt: 1) cố gắng ghi đè lên một phương thức riêng, và 2) quên sử dụng từ khóa 'override'. Nó giống nhau trong Java, ngoại trừ Java có nhiều lỗi hơn vì chú thích '@ Override' là tùy chọn. –