2010-02-24 39 views
8

Đang cố gắng để xác định một phương pháp accessor cho tham số constructor mặc định, ví dụ:Làm thế nào để xác định phương thức accessor cho tham số constructor mặc định?

class Person (age: Int) { 
    def age: Int = this.age 
} 

Mà rõ ràng dẫn đến một lỗi biên dịch: tham khảo rõ ràng để định nghĩa quá tải, cả tuổi phương pháp trong lớp Person của type => Int và giá trị độ tuổi trong lớp Người loại Int khớp với kiểu mong đợi Int

Có cách nào trong ngữ cảnh này để phân biệt giữa tên phương thức thành viên và tên giá trị thành viên được tạo tự động không?

Tất nhiên, có thể thay đổi tên của số nhận dạng, nhưng có cách nào trong trường hợp này thực sự chỉ định định danh nào được đề cập đến không?

Trả lời

16

Chỉ cần đặt "val" trước các tham số hàm tạo mà bạn muốn hiển thị dưới dạng thuộc tính mẫu.

+0

Cảm ơn! Chỉ cần tìm ra nó.:-) Nhưng nếu tôi muốn ghi đè accessor mặc định thì sao? Tôi đoán tôi vẫn cần đổi tên tham số? –

+3

Có, bạn cần đổi tên tham số (ví dụ: 'age0'), sau đó xác định người truy cập' def age = {Math.abs (age0) ' – retronym

6

Sử dụng

class Person (val age: Int) 

nếu bạn chỉ muốn một getter hoặc

class Person (var age: Int) 

nếu bạn cũng muốn có một setter.

3

Câu trả lời ở trên phù hợp với nguyên tắc truy cập thống nhất. Nếu bạn có hoặc cần getters và setters kiểu Java, bạn cũng có thể sử dụng chú thích BeanProperty.

class Person(@scala.reflect.BeanProperty var age: Int) 

này sẽ cho kết quả trong các phương pháp sau đây được tạo ra:

def getAge: Int = age 
def setAge(age: Int) = this.age = age 

Nếu bạn thay vì sử dụng BeanProperty cho một val thay vì một var, setter sẽ không được tạo ra, chỉ có getter.

Một lưu ý khác, phương thức setter không thể được gọi từ bên trong Scala. Thay vào đó, bạn nên sử dụng quy ước chuẩn của Scala về truy cập thống nhất để đặt giá trị.

1

Chỉ để có đầy đủ và mở rộng trên các câu trả lời trước đó, còn có kỹ thuật được bao gồm here.

Để tóm tắt, tôi sẽ luôn luôn bắt đầu với một giá trị bất biến:

class Person (val age: Int) 

Sau đó, nếu bạn tìm ra bạn cần phải biến những giá trị (hoặc bạn biết điều đó trước), chuyển sang:

class Person (var age: Int) 

Sau đó, nếu bạn cần phải xác nhận hoặc làm một số tính toán khác trên get hoặc thiết lập, đổi tên biến của bạn và xây dựng bộ truy bắt chước đặt tên ban đầu của bạn, không cần phải cấu trúc lại phần còn lại của các mã:

class Person(var _age: Int) 
{ 
    def age = 
    { 
     println("age requested") 
     _age 
    } 
    def age_=(newAge: Int) = 
    { 
     assert(newAge > 0) 
     println(s"age changed from ${_age} to $newAge") 
     _age = newAge 
    } 
} 

Tất nhiên, bạn có thể đơn giản hóa setter hoặc getter nếu bạn không cần hoạt động ở đó.

Kêu gọi tất cả các câu trả lời khác, thực sự đúng và đến sớm hơn nhiều.

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