Oop 用面向对象的方法在MATLAB中向方法发送单元格时出现的一个问题

Oop 用面向对象的方法在MATLAB中向方法发送单元格时出现的一个问题,oop,class,matlab,Oop,Class,Matlab,我正在用MATLAB中的OOP(面向对象编程)做一个简单的测试。我创建了一个包含构造函数的简单类。此外,我还就属性做了三个部分:三个常规属性;一个常数;和三个相关性质。我为常规属性包括了两个get/set方法、一个输出方法和一个受保护/静态方法,构造函数使用这些方法:“getPropertyValue(propertyName,inputCell)” 静态方法会导致问题。我正在发送两个参数:字符串类型的“propertyName”和单元格类型的“inputCell”。最后一个参数应该发送从构造函

我正在用MATLAB中的OOP(面向对象编程)做一个简单的测试。我创建了一个包含构造函数的简单类。此外,我还就属性做了三个部分:三个常规属性;一个常数;和三个相关性质。我为常规属性包括了两个get/set方法、一个输出方法和一个受保护/静态方法,构造函数使用这些方法:“getPropertyValue(propertyName,inputCell)”

静态方法会导致问题。我正在发送两个参数:字符串类型的“propertyName”和单元格类型的“inputCell”。最后一个参数应该发送从构造函数中定义的varargin复制的所有输入参数

当我尝试使用该类并在命令行中创建其实例时

a = FigureObjects('promien',10)
我得到这个错误:

类型为“cell”的输入参数的未定义函数“getPropertyValue”

图对象中的错误(第26行) [temp,status,msgStatus]=getPropertyValue('podstawa',inputCell)

我想我可以向任何函数发送任何内容,如字符串、单元格、矩阵等。是否有任何方法将单元格发送到此函数并读取其内容

谢谢

注:这是我的代码:

classdef FigureObjects
%FIGUREOBJECTS Summary of this class goes here
%   Detailed explanation goes here

properties
    podstawa
    wysokosc
    promien
end

properties (Constant = true, Hidden = true)
    liczbaPi = 3.14
end

properties (Dependent = true)
    obwodKola
    obwodProstokata
    obwodKwadratu
end

methods
    % Constructor
    function obj = FigureObjects(varargin)
        inputCell = varargin;
        if nargin > 0
            [temp,status,msgStatus] = getPropertyValue('podstawa',inputCell);
            if status
                obj.podstawa = temp;
            else
                error(msgStatus);
            end
            [temp,status,msgStatus] = getPropertyValue('wysokosc',inputCell);
            if status
                obj.wysokosc = temp;
            else
                error(msgStatus);
            end
            [temp,status,msgStatus] = getPropertyValue('promien',inputCell);
            if status
                obj.promien = temp;
            else
                error(msgStatus);
            end
        end
    end

    % get functions
    function obwodKola = get.obwodKola(obj)
        if ~isempty(obj.promien)
            obwodKola = 2*FigureObjects.liczbaPi*obj.promien;
        else
            error('''promien'' is not defined.');
        end
    end
    function obwodProstokata = get.obwodProstokata(obj)
        if (~isempty(obj.podstawa) && ~isempty(obj.wysokosc))
            obwodProstokata = 2*(obj.podstawa*obj + obj.wysokosc);
        else
            error('Either ''podstawa'' or/and ''wysokosc'' are not defined.');
        end
    end
    function obwodKwadratu = get.obwodKwadratu(obj)
        if ~isempty(obj.podstawa)
            obwodKwadratu = 4*obj.podstawa;
        else
            error('''podstawa'' is not defined.');
        end
    end
    function promien = get.promien(obj)
        promien = obj.promien;
    end
    function podstawa = get.podstawa(obj)
        podstawa = obj.podstawa;
    end
    function wysokosc = get.wysokosc(obj)
        wysokosc = obj.wysokosc;
    end

    % set functions
    function obj = set.promien(obj,promien)
        if isnumeric(promien)
            obj.promien = promien;
        else
            error('''promien'' must be numeric.');
        end
    end
    function obj = set.podstawa(obj,podstawa)
        if isnumeric(promien)
            obj.podstawa = podstawa;
        else
            error('''podstawa'' must be numeric.');
        end
    end
    function obj = set.wysokosc(obj,wysokosc)
        if isnumeric(wysokosc)
            obj.wysokosc = wysokosc;
        else
            error('''wysokosc'' must be numeric.');
        end
    end

    % output functions
    function output = obwod(theFigureObj, rodzajFigury)
        if strcmpi(rodzajFigury,'kolo')
            output = theFigureObj.obwodKola;
        elseif strcmpi(rodzajFigury,'prostokat')
            output = theFigureObj.obwodProstokata;
        elseif strcmpi(rodzajFigury,'kwadrat')
            output = theFigureObj.obwodKwadratu;
        else
            error('Cannot identify a figure.');
        end
    end % obwod
end % methods

methods (Access = protected, Static)
    function [propertyValue, status, msgString] = ...
            getPropertyValue(propertyName, inputCell)
        I = strcmpi(propertyName,inputCell);
        if sum(I) ~= 0
            if (find(I)+1) <= length(inputCell)
                propertyValue = inputCell{find(I)+1};
                status = true;
                msgString = 'No errors';
            else
                propertyValue = [];
                status = false;
                msgString = ['Too few arguments for ''' propertyName '''.'];
            end
        else
            propertyValue = [];
            status = false;
            msgString = ['No property ' propertyName];
        end
    end % getPropertyValue(propertyName, cellArray)
end % methods (Access = protected, Static)
classdef图形对象
%FIGUREOBJECTS这个类的摘要如下
%这里有详细的解释
性质
波德斯塔瓦
怀索科斯克
普罗米安
结束
属性(常数=真,隐藏=真)
liczbaPi=3.14
结束
属性(依赖=真)
奥沃德科拉
ObwodProtokata
奥沃德克瓦德拉图
结束
方法
%建造师
函数对象=图形对象(varargin)
inputCell=varargin;
如果nargin>0
[temp,status,msgStatus]=getPropertyValue('podstawa',inputCell);
如果状态
obj.podstawa=温度;
其他的
错误(msgStatus);
结束
[temp,status,msgStatus]=getPropertyValue('wysokosc',inputCell);
如果状态
obj.wysokosc=温度;
其他的
错误(msgStatus);
结束
[temp,status,msgStatus]=getPropertyValue('promien',inputCell);
如果状态
obj.promien=温度;
其他的
错误(msgStatus);
结束
结束
结束
%获取函数
函数obwodKola=get.obwodKola(obj)
如果~isempty(对象promien)
obwodKola=2*FigureObjects.liczbaPi*obj.promien;
其他的
错误(未定义“promien”);
结束
结束
函数obwodProstokata=get.obwodProstokata(obj)
如果(~isempty(obj.podstawa)和&~isempty(obj.wysokosc))
obwodProstokata=2*(obj.podstawa*obj+obj.wysokosc);
其他的
错误('未定义'podstawa'或/和'wysokosc');
结束
结束
函数obwodKwadratu=get.obwodKwadratu(obj)
如果~isempty(对象为podstawa)
obwodKwadratu=4*obj.podstawa;
其他的
错误(“未定义podstawa”);
结束
结束
函数promien=get.promien(obj)
promien=obj.promien;
结束
函数podstawa=get.podstawa(obj)
podstawa=obj.podstawa;
结束
函数wysokosc=get.wysokosc(obj)
wysokosc=obj.wysokosc;
结束
%设置函数
函数obj=set.promien(obj,promien)
如果是数字(promien)
obj.promien=promien;
其他的
错误('promien'必须是数字');
结束
结束
函数obj=set.podstawa(obj,podstawa)
如果是数字(promien)
obj.podstawa=podstawa;
其他的
错误('podstawa'必须是数字');
结束
结束
函数obj=set.wysokosc(obj,wysokosc)
如果是数字(wysokosc)
obj.wysokosc=wysokosc;
其他的
错误('wysokosc'必须是数字');
结束
结束
%输出函数
函数输出=obwod(图形对象,RODZAJFIGY)
如果strcmpi(rodzajFigury,'kolo')
输出=图形bj.obwodKola;
其他strcmpi(rodzajFigury,'prostokat')
输出=figureobj.obwodProstokata;
其他strcmpi(rodzajFigury,'kwadrat')
输出=figureobj.obwodKwadratu;
其他的
错误('无法识别图形');
结束
结束%obwod
结束%方法
方法(访问=受保护,静态)
函数[propertyValue,status,msgString]=。。。
getPropertyValue(propertyName,inputCell)
I=strcmpi(propertyName,inputCell);
如果和(I)~=0

如果(find(I)+1)仅仅因为该方法是静态的,并不意味着您可以将其作为搜索路径中的一个单独函数来使用。您需要调用
obj.getPropertyValue
FigureObjects.getPropertyValue

仅仅因为该方法是静态的,并不意味着您可以将其作为搜索路径中的单独函数来使用。您需要调用
obj.getPropertyValue
FigureObjects.getPropertyValue

谢谢。我没有真正理解错误描述。这是误导。。。我想,MATLAB在抱怨最后一个参数。谢谢你的帮助。@ZikO:我同意错误信息是混乱的。但是,现在您知道“未定义的函数或变量…”意味着您输入了一个错误或调用了一个不在搜索路径上的函数。谢谢。我没有真正理解错误描述。这是误导。。。我想,MATLAB在抱怨最后一个参数。谢谢你的帮助。@ZikO:我同意错误信息是混乱的。但是,现在您知道“未定义的函数或变量…”意味着您输入了一个错误或调用了一个不在搜索路径上的函数。