在MATLAB中,是否可以将某些类的对象作为类属性作为其他类?

时间:2017-01-14 09:21:55

标签: matlab

我正在尝试在MATLAB 2014中创建一个简单的代理和环境类。

我正试图让对象' a' Agent类作为Environment类的属性之一。我已经在Environment类构造函数中初始化了该对象,但每当我尝试使用此对象A访问Agent类的方法时,我都会收到警告:

  

"令人困惑的函数调用。您的意思是引用属性' a'?"

这是我的Environment类和Agent类。如何直接从interact_with_agent_function调用Agent类的方法,就像我们在JAVA中调用一样?

classdef Environment < handle
    properties (Constant = true)
        V = 0.5;
        T = 1;
    end

    properties (SetObservable= true)
        A;
        B;
        a;
    end

    methods
        function obj = initialize(obj, A, B)
            obj.A = A;
            obj.B = B;
            a = Agent();
        end

        function act = call_agent(obj)
            act = agent_function(a, obj.A, obj.B, obj.V, obj.T); 
        end

        function action = interact_with_agent(obj)
            action = obj.call_agent();
        end
    end
end

classdef Agent < handle
    properties (SetObservable = true)
        action;
    end
    methods      
        function action = agent_function(obj, A, B, v, t)
            obj.action = A + v * t * ((B - A) / norm(B - A));
            action = obj.action;
        end
    end
end

2 个答案:

答案 0 :(得分:0)

这里的问题如下:

  • 在类定义中,您创建了Environment类的变量(property):lowercase a

  • initialize方法中,您创建了一个局部变量a,该函数在函数完成后被删除。您应该使用obj.a = ...将Agent()保存在对象中。

  • call_agent中,您使用未初始化的本地变量a作为第一个输入。如果您的意思是引用您班级的a财产;使用obj.a代替

最重要的是,知道matlab有一个类的默认初始化函数可能是有用的,它与你的类的名称相匹配;在您的情况下,这将是function obj = Agent(obj)function obj = Environment(obj);另请参阅https://nl.mathworks.com/help/matlab/object-oriented-programming.html以获取有关matlab中类的更多信息。

答案 1 :(得分:0)

您应该这样定义您的课程:

classdef Environment < handle
    properties (Constant = true)
        V = 0.5;
        T = 1;
    end

    properties (SetObservable= true)
        A;
        B;
        a;
    end

    methods
        % Replace here the init function using the Matlab Constructor 
        function obj = Environment(obj, A, B)
            obj.A = A;
            obj.B = B;
            obj.a = Agent(); % Call the Agent constructor here
        end

        function act = call_agent(obj)
            % Calling agent_function will automatically put a as the first argument
            act = obj.a.agent_function(obj.A, obj.B, obj.V, obj.T); 
        end

        function action = interact_with_agent(obj)
            action = obj.call_agent();
        end
    end
end

classdef Agent < handle
    properties (SetObservable = true)
        action;
    end

    methods      
        % Create Constructor
        function obj = Agent()
            obj.action = [];
        end

        function action = agent_function(obj, A, B, v, t)
            obj.action = A + v * t * ((B - A) / norm(B - A));
            action = obj.action;
        end
    end
end

我不知道你为什么使用两个函数来使用属性a。 可以直接在函数agent_function中调用函数interact_with_agent

无论如何,如果你真的想用这种方式编码,你应该使用call_agent将函数methods (Static, Access = private)设置为静态。像这样,访问属性a的唯一方法是使用函数interact_with_agent