2011-08-25 30 views
12

Tôi mới sử dụng MATLAB như một môi trường hướng đối tượng và tôi đang viết lớp đầu tiên của mình để mô tả một gói mạng. Một ví dụ đơn giản sẽ là sauTôi có thể gán kiểu cho các thuộc tính lớp trong MATLAB không?

classdef Packet 

    properties 
     HeaderLength 
     PayloadLength 
     PacketType 
    end 

end 

Tôi muốn xác định rõ ràng rằng HeaderLengthPayloadLength đều của uint16 và PacketType là một chuỗi. Có cách nào để làm việc này không?

Trả lời

20

Có tồn tại một undocumented syntax để thực thi các loại tài sản:

classdef Packet 
    properties 
     [email protected] 
     [email protected] = uint16(0); 
     [email protected] 
    end 
end 

Nếu bạn cố gắng thiết lập một tài sản với các loại sai, bạn nhận được một lỗi:

>> p = Packet; 
>> p.PacketType = 'tcp'; 
>> p.HeaderLength = 100; 
While setting the 'HeaderLength' property of Packet: 
Value must be 'uint16'. 

Theo như tôi có thể biết, cú pháp này hỗ trợ tất cả các loại nguyên thủy như: char, int32, double, struct, cell, ..., ngoài bất kỳ người dùng nào được xác định (chỉ sử dụng bất kỳ tên lớp nào).

Lưu ý rằng việc đặt loại như trên có vẻ như ghi đè bất kỳ "phương thức đặt" nào nếu có.

Tôi vừa bắt gặp cú pháp này được sử dụng trong một lớp học nội trong R2013a (toolboxdir('matlab')\graphics\+graphics\+internal\+figfile\@FigFile\FigFile.m), nhưng nó cũng làm việc trong R2012a, có lẽ phiên bản cũ cũng ...

+0

Đó là một tìm kiếm gọn gàng! – Jonas

+6

[Tham khảo chéo] (http://undocumentedmatlab.com/blog/setting-class-property-types) –

+1

@YairAltman: cảm ơn một lần nữa vì đã đăng một bài viết chuyên dụng lên blog của bạn – Amro

6

Vì không thể xác định rõ ràng các loại cho biến trong Matlab, bạn không thể làm điều này khi khai báo thuộc tính.

Tuy nhiên, bạn có thể xác định phương pháp đã đặt để kiểm tra lớp và ném lỗi hoặc chuyển đổi đầu vào thành bất kỳ thứ gì bạn muốn.

Ví dụ

classdef myClass 
    properties 
     myProperty = uint16(23); %# specify default value using correct type 
    end 
    methods 
     function obj = set.myProperty(obj,val) 
     if ~isa(val,'uint16') 
      error('only uint16 values allowed') 
     end 
     %# assign the value 
     obj.myProperty = val; 
     end 
    end 
end 
+0

Nghĩ như vậy. Cảm ơn. – Phonon

6

Các "Restrict Property Values to Specific Classes" tính năng hiện đang hỗ trợ chính thức since R2016a. Nó hoạt động tương tự như cú pháp không có giấy tờ cũ, được mô tả trong Amro's answer.

classdef Packet 
    properties 
     HeaderLength uint16 
     PayloadLength uint16 = uint16(0); 
     PacketType char 
    end 
end 

Tương thích với các phiên bản trước

R2016a hỗ trợ cả hai lựa chọn cú pháp, tôi đã nhận thấy có sự khác biệt giữa chúng. Tuy nhiên, cả hai đều làm việc một chút khác biệt so với "@" - cú pháp có trụ sở tại R2015b:

  1. Trong R2015b, một đối tượng myProp của một lớp MyPropClass2, thừa hưởng từ MyPropClass1, hoàn toàn vượt qua "lớp hạn chế" kiểm tra, và sau đó được lưu trữ "nguyên trạng". Vì vậy, toàn bộ điều hoạt động giống như kiểm tra rõ ràng isa(newPropVal,MyPropClass1) được thêm vào phương thức thuộc tính được đặt MyPropClass1

  2. Trong trường hợp R2016a chuyển đổi đối tượng đã nói thành lớp được chỉ định. Điều này sẽ yêu cầu một hàm tạo thích hợp cho MyPropClass1 và có nghĩa là MyPropClass1 không thể là Abstract.

Ví dụ:

classdef MyPropClass1  
    methods 
     % The following method is only used in R2016a case 
     function obj=MyPropClass1(val)    
     end 
    end   
end 

------------------------------------------------------------ 
classdef MyPropClass2 < MyPropClass1  
end 

------------------------------------------------------------ 
classdef MyObjClass  
    properties 
     [email protected] 
    end 
end 

------------------------------------------------------------ 
myObj = MyObjClass(); 
myObj.someprop = MyPropClass2; 

% The following displays "MyPropClass1" in R2016a, and "MyPropClass2" in R2015b 
disp(class(myObj.someprop)); 

Tương thích với phân cấp lớp

Trong cả hai R2016a và R2015b, các "Giới hạn giá trị tài sản để lớp cụ thể" vòng loại có thể không được tái định nghĩa trong lồng nhau các lớp học. Ví dụ. không thể xác định điều gì đó như:

classdef MyObjClass2 < MyObjClass 
    properties 
     [email protected] 
    end 
end 
Các vấn đề liên quan