gpt4 book ai didi

matlab - 在 MATLAB 的抽象类中声明 function_handle 类型的属性的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-02 01:26:48 25 4
gpt4 key购买 nike

我正在尝试创建一个 MATLAB 中的其他类将继承的接口(interface)。该接口(interface)有一个保存 function_handle 值的属性。我遇到的问题是,在实例化从此类继承的具体类时,我收到消息:定义类“IMyInterfaceClass”的属性“MyFuncHandle”时出错。无法构造 function_handle 类的默认对象。

接口(interface)类看起来像这样:

classdef (Abstract) IMyInterfaceClass < handle
properties (Abstract)
MyFuncHandle(1,1) function_handle
end

methods (Abstract, Access = public)
% Some abstract methods declared here
end
end

另一个类继承该接口(interface),如下所示:

classdef (Abstract) MyClassThatInheritsTheInterface < IMyInterfaceClass & SomeOtherAbstractClass
properties
MyFuncHandle
end

methods (Abstract)
% Some abstract methods declared here
end

methods
function this = MyClassThatInheritsTheInterface()
this@SomeOtherAbstractClass();
end

% Some concrete methods declared here
end
end

最终,一个继承自 MyClassThatInheritsTheInterface 的具体子类。

我尝试将 IMyInterfaceClass 中的属性声明更改为:

    properties (Abstract)
MyFuncHandle(1,1) function_handle = function_handle.empty
end

但是,这行不通。我也尝试过将其设置为默认值,如下所示:

    properties (Abstract)
MyFuncHandle(1,1) function_handle = @ode15s
end

这也行不通。

有什么方法可以让它工作,同时保持对 IMyInterfaceClass 中的 MyFuncHandle 进行类型检查?显然,摆脱类型检查并将其保留为鸭子类型属性可以消除错误,但不能确保属性中的值是 function_handle。

最佳答案

我认为我们可以稍微简化示例来解决这个问题

抽象父类(super class)

classdef (Abstract) IMyInterfaceClass < handle
properties
MyFuncHandle(1,1) function_handle = @(varargin) disp([])
end
methods (Abstract, Access = public)
% Some abstract methods declared here
end
end

具体类继承抽象类

classdef MyClassThatInheritsTheInterface < IMyInterfaceClass
properties
% Subclass properties
end
methods
function this = MyClassThatInheritsTheInterface()
this@IMyInterfaceClass();
end
% Some concrete methods declared here
end
end

这些几乎是从你的示例中提取出来的,只是我跳过了第二层抽象,只使用了一个抽象父类(super class)。以下几点应该仍然适用。

请注意,MyFuncHandle 只能在抽象父类(super class)中指定。

此外,如您所料,function_handle.empty 是空的。但是,您需要根据属性规范使用 1x1 函数句柄。我所知道的满足这一点的最简单的“无所事事”函数是 @(varargin) disp([]) ,它接受任何输入并且不显示任何内容。你当然可以使用一些如果没有被覆盖就会抛出错误的东西

@(varargin) error( 'MyFuncHandle has not been defined' );

现在您可以执行a = MyClassThatInheritsTheInterface();,您将看到a.MyFuncHandle已正确初始化。

也许这里的关键是,这在任何时候都不会尝试将某些东西归类为 Abstract 属性,同时也给它一个与其抽象不一致的值。

关于matlab - 在 MATLAB 的抽象类中声明 function_handle 类型的属性的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74377016/

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