【问题标题】:Matlab OOP: Create a handle class that (inherits from) is also a double?Matlab OOP:创建一个(继承自)也是双精度的句柄类?
【发布时间】:2015-03-28 23:25:28
【问题描述】:

我想创建一个继承(并充当)双重但也是句柄的类。例如:

a     = myHandleDoubleClass();   % Instance of my handle double.
a.val = 1;                       % Set value of a to 1.
b     = a                        % Assign b to the value of a
                                 % but, b is a double, not object
>> b

b = 
    1

现在,如果我更改 a 的值(例如设置 a.val = 2),那么 b 也应该更改,以使其具有相同的值(或者更准确地说,a 和 b 都实际上是指向相同值的指针) .

这在 Matlab 中是否可能?

编辑:为了进一步澄清,这些句柄对象稍后应用作普通双精度对象,并且需要在访问操作中充当此类对象(例如 b=ab=a(ind) 等,而无需显式访问 value 属性(可以使用属性字段设置值,a.val = 1)。目的是拥有一个在许多地方(其他对象,包括补丁)使用的双重对象,您只需在一个地方更改值(由于 handle 属性,所有其他引用都会自动更新)。

示例:

一个应用程序是这样的,用我的双类顶点创建一个补丁

f = [1 2 3];
v = myDoubles();

patch( 'faces', f, 'vertices', v )

v.values = updateValues();
drawnow

因此,每当我在某一点更改值时,补丁也会更新其值,而无需显式进入并更改顶点字段。

【问题讨论】:

  • 为什么没有一个具有双参数的 Handle 类?
  • 我最近的更新是否涵盖了您需要的情况?
  • 我一直在做更多的研究,看起来在Matlab中多重继承是可能的。我需要更多时间来了解您示例的详细信息,但这里的文档让我相信您可能会想要的行为:Subclassing built in classInheriting from multiple classes
  • 感谢您抽出宝贵的时间,不过不用担心。我厌倦了自己做双重课,但“补丁”不接受它作为数字(甚至重载不是数字),所以最后我只是重载了补丁。

标签: matlab oop operator-overloading


【解决方案1】:

编写自己的指针类

如果您只需要一个指向double 的指针,您可以将double 作为您的类的参数。这是一个基于Using pointers in Matlab的代码的简单示例

首先你定义一个继承自句柄类的类,也就是Matlab的指针类。类属性将存储你的双精度。

classdef HandleObject < handle
   properties
      Object=0; % This will be your double
   end

   methods
      function obj=HandleObject(receivedObject) %This is the constructor
         obj.Object=receivedObject;
      end
   end
end

那么你可以把上面的例子写成,

a = HandleObject(1); %The constructor passes the 1 to the Object property
b = a; 

display(b.Object); % Should print 1

要访问ab 的值,您需要使用a.Objectb.Object

需要明确的是,您实际上可以使用HandleObject 来构造指向任何 Matlab 对象类型的指针,而不仅仅是双精度数。如果您调用 h = HandleObject("Hello World"),您将在 h.Object 中存储一个字符串。

使用指向其他 Matlab 类的指针

如果您将此方法与 patch 之类的 Matlab 对象一起使用,您将面临 Matlab 复制 HandleObject.Object 中的值而不是使用指针的风险。

例如,

v_array = [0 0;1 0;1 1;0 1]; % x and y vertex coordinates
f_array = [1 2 3 4]; % vertices to connect to make square
v = HandleObject(v_array); % make a vertex pointer
f = HandleObject(f_array); % make a face pointer
patch( 'Faces', f.Object, 'Vertices', v.Object, 'FaceColor','red');

v.Object = [1 .5; 1 1; .5 1]; % Let's use the pointer to change the vertices
f.Object = [1 2 3]; % and faces to a triangle
drawnow; % But we don't see any change in the figure

我们看不到变化的原因是patch 将值复制到它自己的变量中,而不是存储一个指针。据我所知,没有办法强制patch 使用我们的指针而不是复制值,但有另一种选择:使用指向patch 对象的指针来更改值。

v_array = [0 0;1 0;1 1;0 1];
f_array = [1 2 3 4];
p = patch('Faces',f_array,'Vertices',v_array,'FaceColor','red'); %The patch method optionally returns a handle index
h = handle(p); % Get the handle

% Now I have a pointer to my patch object which I can use to change any property
h.faces = [1 2 3]; % Such as the number of faces
h.vertices = [1 .5; 1 1; .5 1]; % And the location of vertices
h.facecolor = 'green'; % Even the color
drawnow

许多 Matlab 方法,例如 patch 可以选择返回指向它们创建的对象的指针,允许您动态更改属性。其他方法将为您提供有用类的句柄。例如,我经常使用gca 方法来更改绘图轴的属性。

【讨论】:

  • 是的,这是我想到的一种方法,但理想情况下,我希望能够像使用双打一样使用它,即将值分配为 a = 2,获取值a(ind) 其中 a 也可以是双精度数组。 b 应该反映 a 中的变化。
  • @BautaSteen a.Objectb.Object 将完全按照您的描述行事。您只需输入额外的 7 个字符。
  • 我不认为它会在我的预期应用程序中工作。这样做的目的是让双打的“指针”像普通双打一样用于补丁对象中的顶点字段,这样我只需要在点发生变化时更新一个地方。
  • 如果你能添加一个你将如何使用它们的例子,它可能会帮助我理解为什么你不能使用我提议的东西。我要解释的是ab 指向包含双Object 的同一类实例的指针。对a.Object 的更改也会更改b.Object。您只需更新其中一个即可查看另一个的更改。 Handle 是 Matlab 的指针表示方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多