常量属性是Matlab中的静态属性(属于类,而不是实例),就像许多其他OOP语言一样。访问它们的自然方式是ClassName.PropName
和Matlab documentation一样。
但是,在这样的场景中,我无法找到从超类中ClassName.PropName
的方法:
classdef (Abstract) Superclass < handle
properties(Dependent)
dependentProperty
end
properties (Abstract, Constant)
constantProperty
end
methods
function result = get.dependentProperty(obj)
c = class(obj); % Here I have to get class of obj
result = length(c.constantProperty); % to use here as `ClassName.PropName`
end
end
end
classdef Subclass < Superclass
properties (Constant)
constantProperty = [cellstr('a'); cellstr('b')];
end
end
以便输出以下命令结果:(预期输出)
>> subclassInstance = Subclass()
subclassInstance =
Subclass with properties:
constantProperty: {2×1 cell}
dependentProperty: 2
>> subclassInstance.dependentProperty
ans =
2
>>
但相反,我得到了以下信息:( 实际输出)
>> subclassInstance = Subclass()
subclassInstance =
Subclass with properties:
constantProperty: {2×1 cell}
>> subclassInstance.dependentProperty
Struct contents reference from a non-struct array object.
Error in Superclass/get.dependentProperty (line 13)
result = length(c.constantProperty);
>>
还尝试了c = metaclass(obj)
,它给出了&#34;没有合适的方法,属性或字段&#39; constantProperty&#39;对于
class&#39; meta.class&#39;。&#34;
问题:有没有办法从超类中获取对象的类,能够编写像ClassName.PropName
这样的语句?
编辑:
我知道我可以从像这样的对象引用到达:
function result = get.dependentProperty(obj)
result = length(obj.constantProperty);
end
但这不是我想要的,因为它让读者认为constantProperty
是一个实例属性。这也没有在Matlab中记录,而是文档说ClassName.PropName
,这让我觉得必须有办法。
答案 0 :(得分:2)
正确在matlab中执行此操作的方法是通过实例,根据我之前回答的部分,您现在已将其纳入您的问题中。这是因为matlab的面向对象模型是基于“实例”的。
常量属性是实例属性;它恰好在所有情况下都是相同的(即常数)。据推测,这就是为什么它被称为“常量”而不是“静态”:它不是指内存中的单个静态项,如c;相反,每个实例都使用相同的常量值进行实例化。
你通过“类引用”来调用它没有任何好处(没有这样的东西存在btw;与python和julia不同,类原型不是可以引用的对象,也没有类型本身)。
但是,如果你坚持,确实碰巧是使用元类的一种方法,因为构造函数中的常量属性集将具有在其元类配置文件中命名的默认值
subclassInstance = Subclass();
m = metaclass(subclassInstance);
mp = findobj (m.PropertyList, 'Name', 'constantProperty');
mp.DefaultValue
另外,要解决为什么class(subclassInstance).constantProperty
不起作用,这只是因为class(subclassInstance)
的结果是字符串(其值恰好是类名),不是对类的“引用”(就像我说的,matlab中不存在这样的东西)。
但是,如果您愿意,显然您可以在eval语句中使用这样的类名字符串来评估它,就好像您直接在终端中键入它来访问常量属性一样。所以这是实现你所追求目标的另一种方式:
eval([class(subclassInstance) '.constantProperty'])
但理论上eval
除非别无选择,否则通常应避免使用陈述。
<小时/> 简短说明:
在Java中可以通过this.getClass()
实现
在java中,这称为reflection,它是java自己的'检查'对象机制。当您执行myObject.getClass()
之类的操作时,您返回的内容仍然而不是“对类原型的引用”。它是Class
类型的实例。即即使在java中,你也不能myObject.getClass().aStaticProperty
。但是可以使用getFields
类提供的Class
方法获取Field
个对象,并检查它们对特定对象实例的值;对于静态字段,此实例只是成为null
对象。