2017-10-12 283 views
2

我正在使用Matlab 2017a並有一個繼承自串行類的子類。創建子類的對象後,我看不到其他的子類屬性。例如inspect(subclassobject)properties(subclassobject)將只列出超級串行的屬性。仍然可以使用點符號subclassobject.property來查看或更改屬性值,但set和get函數將產生錯誤,指出子類屬性不是類'串口對象'的可訪問實例。我已經包含了我的類定義和構造函數。Matlab檢查器不會列出子類的對象屬性

classdef subclass < serial 
    properties 
     prop_1 
    end 
    methods 
     % Constructor 
     function obj = subclass(port) 
      obj = [email protected](port); 
      %port is a string ex. 'com3' that is necessary for 
      %constructing the serial class 
     end 
    end 
end 

回答

1

serial類重載subsref方法,它是在使用myobject.mypropertymyobject(1)你索引到一個對象,例如調用的方法。並看看代碼(toolbox\matlab\serial\@serial\subsref.m),它似乎並沒有以非常乾淨的方式做到這一點。

出於這個原因,你會繼承serial時有困難,除非你也實現你的子類subsref。正確實施subsref是一個痛苦的世界。只是我的2c,但在我看來,MathWorks應該已經讓serial成爲一個密封類,所以你甚至不能嘗試子類。

我猜你會繼續有類似的問題(我想我看到了另一個類似的問題,前幾天,可能已經從你的,這表明或許你已經發現這一點)。

我會建議你不要子類serial。取而代之的是,創建一個類,包裝serial,類似如下:

classdef MyClass 
    properties (Hidden, Access = private) 
     myserialobject 
    end 
    properties 
     mySubClassProp1 
     mySubClassProp2 
     %... 
    end 
    properties (Dependent) 
     mySerialProp1 
     mySerialProp2 
     %... 
    end 
    methods 
     function obj = MyClass(port) 
      obj.myserialobject = serial(port); 
      % Set other subclass props 
     end 
    end 
    methods 
     function val = get.mySerialProp1(obj) 
      val = obj.myserialobject.mySerialProp1; 
     end 
     function obj = set.mySerialProp1(obj, val) 
      obj.myserialobject.mySerialProp1 = val; 
     end 
     %... pass through get and set for each serial prop you need to access 
     function obj = mySerialMethod1(obj, varargin) 
      mySerialMethod1(obj.myserialobject, varargin{:}); 
     end 
     %... pass through method for each serial method you need to access 
    end 
end 

基本上你有一個類,它有一個serial對象的屬性,有一堆屬性和作爲自己的方法好。當你需要訪問serial對象的屬性,使從屬屬性與getset方法,只是通過值或從底層serial對象。同樣,如果您需要訪問serial對象的方法,創建類的方法,只是通過底層serial對象調用。

該模式使用組合物而非繼承。這通常(並非總是)好的做法,但在這種情況下,它還可以爲您節省超載的所有問題subsref