句柄类和值类的区别

14

我有一定的C++编程背景,想在Matlab中使用类。

句柄(handle)和值类(value class)有什么区别?

我知道如果我想定义一个矩阵类并重载运算符如“+”和“*”,我就应该使用值类。然而,有时候似乎只有在选择句柄类时,事情才按照我想要的方式工作。

2个回答

22

MathWorks在他们的帮助文档PDF文档中提供了一些关于用途的信息。我还发现Yagtom项目(最初由Matt Dunham编写)的这篇文章是MATLAB面向对象编程的绝佳入门资料。

在帮助文档中,这样解释(重点是我的):

MATLAB支持两种类——句柄类和值类。您使用的类取决于类实例的期望行为以及您想要使用的功能。 当您想要创建对类对象中包含的数据的引用,并且不希望对象的副本复制对象数据时,请使用句柄类。例如,使用句柄类来实现包含电话簿条目信息的对象。多个应用程序可以访问特定电话簿条目,但只能有一个基础数据集。 句柄的引用行为使这些类能够支持事件、侦听器和动态属性等功能。 使用值类表示不需要唯一性的实体,如数字值。例如,使用值类来实现多项式数据类型。您可以复制。在Matt Dunham的文章中,提出了另一个区分这两种类型的好方法: 我们之前提到Matlab中的对象是(默认情况下)按值传递的,这意味着在方法调用中会传递完整的副本。然而,Matlab图形对象是通过句柄(handle)按引用传递的。如果我们对内置的句柄类进行子类化,则我们类的对象也将通过引用而不是值传递。

我个人倾向于使用句柄类以获得我在Java中习惯的一些语法: 对于句柄类,您可以使对象存储所有信息,以便您可以执行像sort(a)(或a.sort())这样的操作。 对于值类,相当于这个的是a = sort(a)(或a = a.sort())。对于运算符,第一种语法根本没有意义,但第二种显然是普遍使用的:例如a = a + b(这相当于a = plus(a,b)a = a.plus(b))。

  • 如果您的类的主要关注点是存储某种(数值)值并能够执行操作,则最可能使用值类。
  • 如果您想要存储状态、组相关值、连接不同的对象(链接列表、图形等),则句柄类可能是正确的选择。

至少,这就是我用来区分的方式。


0

实际上,这很简单,与您提到的语言不同。处理类通过引用传递。值类按值传递。与C/C++的区别在于,该机制是类型系统的一部分,而不是可以对任何变量执行的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接