gpt4 book ai didi

matlab - 为什么 MATLAB 会尝试实例化抽象属性?

转载 作者:行者123 更新时间:2023-12-04 15:14:22 24 4
gpt4 key购买 nike

在 MATLAB 中将类属性验证与抽象属性相结合时,会出现(对我而言)意想不到的行为。这是一个涉及三个类的简短示例:

classdef TestClass
properties (Abstract)
aprop (1,1) TestClassB
end
end

classdef TestClassB
methods
function obj = TestClassB(a)
disp(a);
end
end
end

classdef TestClassC < TestClass
properties
aprop
end
end

然后,当尝试实例化 TestClassC 对象时,出现以下错误:

>> TestClassC()
Error defining property 'aprop' of class 'TestClass'. Unable to construct default
object of class TestClassB.

显然,MATLAB 试图在 TestClass 中实例化抽象属性 aprop,然后由于 aprop< 中缺少有效的零参数构造函数而失败 的类定义 TestClassB。我意识到零参数构造函数问题在理论上是可以解决的(尽管只有在您有权修改 TestClassB 的情况下),但 MATLAB 正在实例化一个抽象属性这一事实似乎很奇怪。维基百科关于抽象类型的文章的第一行字面意思是:

...an abstract type is a type in a nominative type system that cannot be instantiated directly...

也许这是MATLAB作为一种弱类型语言实现属性验证的唯一方式,但这是一个不幸的结果。

附带说明一下,如果 TestClassB 具有有效的零参数构造函数但被定义为抽象的,您最终会落入相同的陷阱但会出现稍微不同的错误:

>> TestClassC()
Error defining property 'aprop' of class 'TestClass'. Class TestClassB is abstract.
Specify a default value for property aprop.

这种行为有充分的理由吗?

编辑:

额外的测试类观察

  1. 删除 TestClass 中的大小验证消除了错误。显然,MATLAB 在没有有效的零参数构造函数的情况下初始化空对象数组没有问题。注意:这仅在 TestClassB抽象时有效。
  2. 如果 TestClassB 是抽象的并且 TestClassC 使用 的具体子类初始化 aprop 在属性 block 中>TestClassB,没有错误(假设具体子类有一个有效的零参数构造函数)。注意:如果 aprop 是在 TestClassC 的构造函数中初始化的,则这为真。

激励示例

Car UML diagram

上面的UML图就是继承与组合相结合的典型例子。 GenericCarGenericEngine 是抽象类。 GenericCar 包含一个 GenericEngine,但 Racecar 将其引擎指定为具体的 V8(“isa” 通用引擎)。不幸的是,这不能在 MATLAB 中使用属性验证来构造,因为 MATLAB 不允许您重新定义抽象属性的类,即使它是原始定义的子类。

假设您接受不能将 Racecar 中的 engine 定义为 V8。即便如此,如果您没有在 Racecar 的属性 block 中为 engine 提供初始值,MATLAB 将在创建Racecar 对象,因为它将尝试使用抽象类型 GenericEngine 初始化 engine。即使 Racecar 的构造函数将引擎初始化为 V8 对象也是如此。 这突出了属性验证和对象实例化之间的奇怪联系。

最佳答案

看来应该回答两个问题:

1 - “显然,MATLAB 正在尝试实例化 TestClass 中的抽象属性 aprop。那么,为什么 MATLAB 会尝试实例化抽象属性?”

根据documentation (重点是我):

You can define property validation for abstract properties. The validation applies to all subclasses that implement the property.

MATLAB 正在尝试实例化 TestClassC 中的属性 aprop,它是 TestClass具体子类。但它使用与 TestClass 相同的验证规则。 TestClassCaprop 属性不是抽象的。

2 - “如果 TestClassB ... 被定义为抽象的,您最终会落入同样的陷阱...”

引用documentation :

abstract class — A class that cannot be instantiated, but that defines class components used by subclasses.

TestClassC 使用与 TestClass 相同的验证规则。它尝试实例化属于 TestClassB 类的 aprop 成员,但 TestClassB 是抽象的,无法实例化。

关于matlab - 为什么 MATLAB 会尝试实例化抽象属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64598496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com