2015-01-13 14 views
5

Câu hỏi của tôi liên quan đến các thuộc tính trong haxe. Nếu tôi hiểu chính xác, nếu tôi tạo tài sản như thế này var propertyInt(get, set):Int; theo tài liệu haxe, nó không thực sự là một biến. Nhưng tôi có thể biến nó thành một biến bằng cách sửa đổi nó theo cách này @:isVar var propertyInt(get, set):Int;. Nếu không, tôi cần phải thực hiện hai phương pháp:Tài sản Haxe - getters và setters so với @: isVar

function get_propertyInt() 
    return propertyInt; 

function set_properyInt(i) 
    return propertyInt = i; 

Câu hỏi của tôi là: liệu tôi có đang sử dụng độc quyền @:isVar var propertyInt(get, set):Int; không? Ví dụ tôi có nhiều hơn 5 thuộc tính trong lớp của tôi và như bạn có thể tưởng tượng làm cho phương pháp này cho mọi tài sản có thể là nỗi đau lớn ở phía sau. Vậy cách tiếp cận tốt nhất là gì?

Trả lời

10

Dưới đây là những gì các documentation đã nói về tính chất vật lý (còn gọi là lĩnh vực ủng hộ):

Một lĩnh vực được coi là vật lý nếu nó là một trong hai

  • biến
  • thuộc tính có mã định danh truy cập đọc hoặc truy cập là default hoặc null
  • một tài sản với :isVar metadata

Vì vậy, bạn có thể thiết lập một thuộc tính mà đầy đủ bao gồm các giá trị tính toán. Hãy suy nghĩ một thuộc tính chỉ đọc cho bạn diện tích hình chữ nhật như một hàm chiều rộng và chiều cao, hoặc nghĩ về một thuộc tính được hỗ trợ bởi một số thuộc tính khác và chỉ trả về/đặt chiều rộng và chiều cao trong một đơn vị khác. Hoặc có thể bạn chỉ muốn đặt tên cho các trường sao lưu của mình theo cách khác, ví dụ: m_widthm_height.

:isVar là hữu ích trong các tình huống mà các quy tắc truy cập thuộc tính vv được trình bày ở trên sẽ cho phép trình biên dịch nghĩ rằng không có trường sao lưu cần thiết. Trong trường hợp đó, các mã sẽ thất bại (từ các tài liệu một lần nữa):

// This field cannot be accessed because it 
    // is not a real variable 
    public var x(get, set):Int; 

    function get_x() { 
    return x; 
    } 

    function set_x(x) { 
    return this.x = x; 
    } 

Bằng cách thêm :isVar bạn về cơ bản cho trình biên dịch mà bạn hoàn toàn muốn các lĩnh vực sao lưu. Các tùy chọn khác đối với trường hợp cụ thể của bạn sẽ được sử dụng default,default, trong trường hợp trình biên dịch biết có một lĩnh vực sao lưu tự động theo yêu cầu và truy cập nên bị hạn chế theo các cấp độ truy cập của tài sản (public hoặc private):

public var propertyInt(default, default):Int; 

trong trường hợp đó bạn cũng có thể sử dụng một biến trực tiếp, bởi vì ảnh hưởng thực là trong bản chất giống nhau:

public var propertyInt : Int; 
+0

Cảm ơn nhiều cho câu trả lời rất thỏa mãn. Tôi sẽ đưa nó vào sử dụng tốt. Im vẫn còn lúng túng lẫn lộn, tôi nhảy qua từ C# và im từ từ bắt đầu hiểu tất cả các tính năng haxe. Cảm ơn nhiều ! :) –

+0

Tôi cũng khuyên bạn nên tra cứu ý nghĩa của 'riêng tư 'trong Haxe - nó khác so với C# :-) – JensG

+0

Tôi nhận thấy rằng tính riêng tư có chức năng được bảo vệ. Tại sao vậy ? Hơi khó chịu một chút. Có một số lời giải thích hợp lý cho hành vi này? Ngoài ra tôi ghét thiếu chức năng vòng lặp 'for' cổ điển ... –

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