2011-08-15 69 views
5

Giả sử tôi có các lớp sau:MATLAB - đặt/truy cập vào các trường của cấu trúc?

classdef myClass 
    properties 
     Globals = struct(... 
      'G1', 1,  ... 
      'G2', 2  ... 
     ); 
    end 
    methods 
     % methods go here 
    end 
end 

tôi sử dụng struct vì có các tài sản khác có cấu trúc.

Có cách nào để cung cấp trình thiết lập cho trường của cấu trúc không? Naively cung cấp

function obj = set.Globals.G1(obj, val) 
    obj.Globals.G1 = val; % for example 
end 

không hoạt động.

Trả lời

4

Bạn phải xác định phương thức set cho toàn bộ cấu trúc (xem bên dưới). Ngoài ra, bạn có thể định nghĩa một lớp cho "Globals", trông sẽ giống như một cấu trúc cho hầu hết các mục đích thực tế (ngoại trừ việc bạn không thể viết sai tên trường) và có thể thực hiện các phương thức thiết lập/nhận riêng cho các thuộc tính của nó.

function obj = set.Globals(obj,val) 

%# look up the previous value 
oldVal = obj.Globals; 

%# loop through fields to check what has changed 
fields = fieldnames(oldVal); 

for fn = fields(:)' %'# 
    %# turn cell into string for convenience 
    field2check = fn{1}; 

    if isfield(val,field2check) 
     switch field2check 
     case 'G1' 
     %# do something about G1 here 
     case 'G2' 
     %# do something about G2 here 
     otherwise 
     %# simply assign the fields you don't care about 
     obj.Globals.(field2check) = val.(field2check); 
     end 
    end 
end 
end %# function 
+0

Đó là những gì tôi đã tìm, nhưng tôi đã tìm tôi sẽ hỏi. Vấn đề tôi gặp phải với lớp Globals là tôi có một số lớp "ngang hàng" mà tất cả đều thừa hưởng yêu cầu để có cấu trúc Globals, nhưng những gì bên trong cấu trúc đó có thể khác nhau. Có cách nào để tạo ra setters động/getters? Tôi vừa biết cách sử dụng các thuộc tính động, –

+1

@ strictrude27: Nếu lớp cha xác định thuộc tính, thì nó cũng phải xác định các phương thức set/get. Tuy nhiên, các phương thức đặt/nhận này có thể gọi, ví dụ: các phương thức được gọi là "setGlobal" và "getGlobal", do đó có thể bị quá tải. Cá nhân, tôi đã đi với các thuộc tính động trong một trường hợp tương tự, nhưng kinh nghiệm cho thấy rằng trừ khi bạn thực sự cần các thuộc tính động, tốt hơn là không mạo hiểm phát hiện lỗi Matlab. – Jonas

+0

Tất cả những gì tôi muốn làm với setters động là làm kiểm tra kiểu - ý định của tôi là đối xử với đối tượng này như một cấu trúc và không có gì khác .. –

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