Hãy xem xét các lớp sau đây viết bằng Java:Scala thành viên lớp và các thông số constructor tên đụng độ
class NonNegativeDouble {
private final double value;
public NonNegativeDouble(double value) {
this.value = Math.abs(value);
}
public double getValue() { return value; }
}
Nó định nghĩa một lĩnh vực thức gọi value
đó được khởi tạo trong constructor, bằng cách lấy thông số của nó được gọi là giống nhau và áp dụng một chức năng cho nó.
Tôi muốn viết một cái gì đó tương tự như nó trong Scala. Lúc đầu, tôi đã cố gắng:
class NonNegativeDouble(value: Double) {
def value = Math.abs(value)
}
Nhưng trình biên dịch phàn nàn: lỗi: quá tải nhu cầu giá trị phương pháp cho kết quả loại
Rõ ràng là trình biên dịch cho rằng sự biểu hiện value
bên trong biểu Math.abs(value)
đề cập đến phương pháp này được xác định . Do đó, phương thức được định nghĩa là đệ quy, vì vậy tôi cần nêu rõ kiểu trả về của nó. Vì vậy, các mã tôi đã viết không làm những gì tôi mong đợi nó để làm: Tôi muốn value
bên trong Math.abs(value)
để tham khảo các tham số constructor value
, và không để phương pháp được xác định. Nó giống như trình biên dịch ngầm thêm một số this.
đến Math.abs(this.value)
.
Thêm val
hoặc var
(hoặc private ...
biến thể) vào tham số hàm tạo dường như không hữu ích.
Vì vậy, câu hỏi của tôi là: tôi có thể xác định thuộc tính có cùng tên với tham số hàm tạo, nhưng có thể có giá trị khác không? Nếu vậy, làm thế nào? Nếu không, tại sao?
Cảm ơn!
Một hàm tạo không được tạo thành một thuộc tính trừ khi đó là một lớp chữ thường hoặc được chú thích với val hoặc var. Nó có sẵn để sử dụng bất cứ nơi nào bên trong định nghĩa lớp mặc dù. –
Có bất kỳ loại quy ước đặt tên nào của các tham số hàm tạo trong các trường hợp như vậy không? –
@Bruno - Có một số quy ước đặt tên; Cá nhân tôi thích cái mà trong đó 0 được nối thêm vào tên, vì số 0 đó ngụ ý điểm bắt đầu và nó ngắn gọn. (Đôi khi gạch dưới đôi khi được thêm vào hoặc nối thêm, nhưng cá nhân tôi cảm thấy có rất nhiều dấu gạch dưới nằm xung quanh.) –