在Matlab中实现抽象属性的问题

在Matlab中实现抽象属性的问题,matlab,oop,abstract-class,Matlab,Oop,Abstract Class,在Matlab(2017b)中,我试图实现一个具有尚未定义的抽象属性的超类 classdef Class_Test1 属性(抽象=真) obj 结束 结束 然后子类应实现此属性并将其限制为某个类,例如: classdef Class_Test2

在Matlab(2017b)中,我试图实现一个具有尚未定义的抽象属性的超类

classdef Class_Test1
属性(抽象=真)
obj
结束
结束
然后子类应实现此属性并将其限制为某个类,例如:

classdef Class_Test2
a=Class_Test2现在抛出一个错误:

The property 'obj' restriction defined in class 'Class_Test2' must match
the property definition in base class 'Class_Test1'.
在抽象类的实现中,是否无法指定
obj
的类/类型,或者我是否遗漏了什么

最后,我希望
obj
Class_Test1
中是抽象的,以实现几个子类,这些子类将在
obj
中保存不同类的对象


感谢您的帮助……

好的,所以进一步研究后,这似乎是基于Matlab设计的故意限制。我不太熟悉其他语言中的OOP,但我有兴趣了解这是一个通用的OOP基础,还是特定于Matlab

作为解决方案,我提出了以下解决方案:

classdef(抽象)类_Test1
。。。以及实施

classdef Class_Test2

我仍然有兴趣了解其他可能的解决方案。

MATLAB类很奇怪。。。或者,在任何情况下,如果您已经学习过任何其他编程语言的类,则与您对类的期望非常不同

MATLAB的一个方面是它是一种解释语言。在执行时对内容进行评估,而不是在编译时。所以代码并不总是有意义的

因此,我们可以这样解决您的问题:

classdef(抽象)foo
方法
函数c=getclass(in)
c=等级(单位:obj);
结束
结束
结束
函数
foo.getclass
似乎没有意义,因为
foo
没有属性
obj
。但是因为
foo
是抽象的,所以我们永远不会有类
foo
的对象,我们将在其上调用
getclass
方法。无论何时调用
getclass
,它都将是一个派生类。因此,如果我们想使用这个
getclass
方法,我们需要确保派生类有一个属性
obj

classdef foo_uint8
现在可以调用
foo\u uint8.getclass

>a=foo_uint8;
>>a.getclass
ans=
‘uint8’

在C++中,你也不能这样做。可以使用虚拟方法,其中派生类更改行为,但类型必须完全相同。但是MATLAB使用类似Python的“duck-typing”,因此您可能根本不需要在超类中声明
obj
。只需确保每个派生类都有一个
obj
属性。我需要在超类中声明
obj
,因为我还声明了方法,这些方法在不依赖其类型的情况下对
obj
进行操作。因此,
Obj
被定义为抽象,但在超类中没有类型。如果这样做,我将设置
。Obj
在获得无效输入时抛出错误,而不是默默地忽略它(这可能导致难以诊断的错误):
If~isa(in,Obj.ObjClass);错误('Obj的输入类型无效:%s',class(in);end
。这也会使该行为更像属性类型限制。Re:“我需要在超类中声明Obj,因为我还声明方法,这些方法在不依赖其类型的情况下对Obj进行操作。”这在Matlab中不是真的!在超类中,您可以引用仅在子类中定义的属性;只要它们是公共的,它仍然可以工作。(只要您不需要直接实例化和使用超类,而不是使用定义这些属性的子类。)…为了简洁起见,我放弃了扩展错误检查。至于在超类方法中使用属性,它们实际上没有在超类中定义:我从来没有想到这是可能的…非常有趣。