2017-03-09 19 views
5

MATLAB R2016a giới thiệu một cơ chế được tài liệu để hạn chế lớp thuộc tính của đối tượng (tôi biết rằng cũng có cách cũ, khác, không có giấy tờ để làm điều đó, nhưng tôi không sử dụng phương pháp đó). Ví dụ:MATLAB: khám phá lớp bị hạn chế của các thuộc tính

classdef MyClass 
    properties 
     myProperty RestrictedClass 
    end 
end 

sẽ hạn chế thuộc tính myProperty để giá trị của nó phải thuộc loại RestrictedClass.

Nếu bạn đã triển khai một lớp học như vậy, có cách nào để sử dụng giao diện siêu dữ liệu lớp MATLAB để lập trình khám phá lớp thuộc tính bị hạn chế không?

Tôi đã hy vọng rằng nếu tôi sử dụng

m = ?MyClass; 
p = m.PropertyList(1); 

sau đó các đối tượng metaproperty p sẽ chứa thông tin về các lớp học mà nó đã được hạn chế - nhưng có vẻ như không.

Có cách nào để khám phá theo chương trình không? Phương pháp này sẽ không cần phải liên quan đến việc thực sự khởi tạo lớp - cả hai vì nó có thể có các tác dụng phụ, và cũng bởi vì nó sẽ cần phải làm việc với các lớp Abstract.

PS Cũng không liên quan đến bất kỳ thứ gì giống như phân tích cú pháp mã nguồn của lớp. Hãy tưởng tượng rằng tôi có thể muốn làm điều này với một lớp học có mã nguồn đã được obfuscated sử dụng pcode.

Trả lời

0

Bạn có thể sử dụng hack không có giấy tờ để chuyển đổi đối tượng thành cấu trúc để kiểm tra các thuộc tính không công khai của đối tượng. Các meta.Property đối tượng chứa một ẩn tài sản meta.Validation đối tượng, trong đó có thông tin xác nhận cho bất động sản:

Validation with properties: 

       Class: [1×1 meta.class] 
        Size: [1×0 meta.ArrayDimension] 
    ValidatorFunctions: {1×0 cell} 

Với một lớp ví dụ đưa ra:

classdef SOcode 
    properties 
     myProperty1 double 
     myProperty2 struct 
    end 
end 

Chúng ta có thể làm điều gì đó như sau:

SOcodemeta = ?SOcode; 

nprops = numel(SOcodemeta.PropertyList); 
validationclass = cell(nprops, 1); 

warning('off', 'MATLAB:structOnObject'); 
for ii = 1:nprops 
    fullpropmeta = struct(SOcodemeta.PropertyList(ii)); 
    validationclass{ii} = fullpropmeta.Validation.Class.Name; 
end 
warning('on', 'MATLAB:structOnObject'); 

Và nhận:

>> validationclass 

validationclass = 

    2×1 cell array 

    {'double'} 
    {'struct'} 
Các vấn đề liên quan