2017-10-12 284 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