Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 在Matlab中使用抽象类(无属性)_Oop_Matlab - Fatal编程技术网

Oop 在Matlab中使用抽象类(无属性)

Oop 在Matlab中使用抽象类(无属性),oop,matlab,Oop,Matlab,让我们有一个抽象类: classdef ACalculation < handle methods (Abstract) [result] = calculate (this, data); plot (this, data, limX, limY); end end 使用继承是一种糟糕的方式吗? 我是否应该忽略matlab将函数更改为静态的建议? 我还能在这里做什么?如果calculate是一个静态的Maximum方法,您可以使用'

让我们有一个抽象类:

classdef ACalculation < handle

    methods (Abstract)
        [result] = calculate (this, data);

        plot (this, data, limX, limY);
    end

end
使用继承是一种糟糕的方式吗? 我是否应该忽略matlab将函数更改为静态的建议?
我还能在这里做什么?

如果
calculate
是一个静态的
Maximum方法,您可以使用'result=Maximum.calculate(data)
来调用它,而不必实例化
标准


使用继承或来自MATLAB的错误建议(不一定)是一种不好的方式。

我认为在这种情况下,静态接口实现是一种非常好的模式。 按以下方式定义类:

classdef ACalculation < handle

    methods (Abstract,Public,Static)
        [result] = calculate (data);    
        plot (data, limX, limY);
    end

end

classdef Maximum < ACalculation

    methods (Public,Static)
        function [result] = calculate (data)
            %...
        end

        function plot (data, limX, limY)
            %...
        end
end
然后创建一个
Maximum
空实例并将其传递给
foo

 foo ( Maximum.empty(0), [1 2 3]);
如果要更改计算方法,请调用

 foo ( Minimum.empty(0), [1 2 3]);

当你说这样的模式行不通时,你的想法就像Java/C#/C++开发者一样。但是与C++中静态和虚拟关键字不能共存的情况不同,Matlab没有这样的限制,因为所有的操作都是在运行时完成的,并且一个“实例”可以是空的,或者是一个代码< n>代码>元素的数组。< /p>但是如果我还有其他类(最小,平均等)我想在一开始的某个地方选择使用哪种类型,然后使用抽象类的某个对象,而不说它到底是哪个类。在这种情况下,我不能使用static,不是吗?
 function foo(acalc,data)
      assert(isa(acalc,'ACalculation'));
      acalc.calculate(data);
      acalc.plot(data,[100 200]);
 end
 foo ( Maximum.empty(0), [1 2 3]);
 foo ( Minimum.empty(0), [1 2 3]);