Matlab - 面向对象方法

Matlab - OOP Methods

我正在 MATLAB 中研究一些 OOP。我目前正在创建一个 class 如下:

classdef uavclass
    properties
        %all properties of the uav
        position = [0,0,0]
        charge = 100;
        destination = [0,0,0];
        maxVertClimb = 2;
        maxHorizSpeed = 5;
        sensorRange = 25;
        unloadingTime = 60;
        safeDistance = 5;
        chargingTime = 300;
        minCruiseAlt = 20;
        maxCruiseAlt = 70;
    end
    methods(Static)
        function uav = uavclass(x,y,z)
            uav.position = [x,y,z]
        end
    end
end

我可以在 position 处创建一个 uav,方法是调用:

uav1 = uavclass(20,20,0);
uav2 = uavclass(40,40,0);
uav3 = uavclass(50,50,0);
uav4 = uavclass(80,80,0);
uav5 = uavclass(90,90,0);

每当我尝试对 uav 对象使用任何类型的方法时,我都会收到错误消息。一个例子就是简单地尝试更改一些 uav

sensorRange
    function changesense(b) 
        uav.sensorRange = b
    end

也试过uavclass.sensorRange。我尝试用 uav1.changesense(5) 调用它,但它不会更改值。我也尝试过使用和不使用 (Static) 作为方法,以及 changesense(uav1,b)

我做错了什么?

每个方法都必须有第一个参数,它定义了被修改的对象。这意味着,您需要像这样实现它:

function obj = changesense(obj, b) 
    obj.sensorRange = b
end

这只是它在 MATLAB 中的工作原理。 也可以在这里查看一些简单的 OOP 示例: https://de.mathworks.com/help/matlab/matlab_oop/getting-familiar-with-classes.html and this docu about different types of methods: https://de.mathworks.com/help/matlab/matlab_oop/specifying-methods-and-functions.html#brqy87j 如果您想使用静态方法(不在对象的上下文中工作,则不需要第一个参数)。

与Python中的self是同一个概念。

你想知道的关于 matlab 中的 OOP 的一切都完整地记录在这个主页的任何子页面中:https://de.mathworks.com/help/matlab/object-oriented-programming.html

有几种方法可以解决这个问题。 "quick-and-dirty"-est 将使用以下内容注释 properties 部分:

properties (Access = public)

通过这种方式,您将能够像 struct.[=22= 一样读写对象属性(或“字段”) ]


几点说明:

  1. 您可以创建多个 methodsproperties 块,每个块都有自己的属性。例如,通过这种方式,您可以将一些 methods 块包含 Static 方法,而其他块可以定义 private 等。我建议将您的属性分成两个块,其中 1st包含一些常量,另一个包含你实际的"instance variables":

    properties (Constant = true) %// Class constants
        MAX_VERT_CLIMB = 2;
        MAX_HORIZ_SPEED = 5;
        ...
    end
    
    properties (Access = public, Constant = false) %// Instance variables
        sensorRange@double scalar = [];
        position@double vector = [];
        ...
    end
    
  2. Accessor & Mutator 方法:如 中所述,人们可能希望使用方法来更改和访问实例字段的值,因为这些通常在长 运行。您可以阅读更多相关信息,例如Bloch 的 有效 Java项目 14:在 public 类 中,使用访问器方法,而不是 public 字段".

  3. 我认为用 Method Attributes 注释包含构造函数的 methods 块是不正确的。我这么说只是因为它在 MATLAB 的例子中是这样出现的,我 相信 这与子类化某些 "convenience classes" 需要构造函数块没有属性有关,但是很可能还有另一种解释。

我认为您的代码应该做一个简单的更改。

classdef uavclass
    properties
        %all properties of the uav
        position = [0,0,0]
        charge = 100;
        destination = [0,0,0];
        maxVertClimb = 2;
        maxHorizSpeed = 5;
        sensorRange = 25;
        unloadingTime = 60;
        safeDistance = 5;
        chargingTime = 300;
        minCruiseAlt = 20;
        maxCruiseAlt = 70;
    end
    methods
        function uav = uavclass(x,y,z) % this is constructor
            uav.position = [x,y,z];
        end
    end
end

请注意,您的函数名称与 class 的名称相同。这表明这个函数是一个构造函数。您应该删除 methods 中的 Static 属性。构造函数还必须遵循一些规则。其中之一是函数必须 return 对构造函数创建的对象的引用,在您的情况下它是 uav 但它可以是任何东西。我一般用obj.

请记住,您已决定制作您的财产public。否则,您可以使用属性之一:privateprotected 并通过 setter 或 getter 控制对属性的访问。

如果您在 class 中定义任何其他方法,第一个参数必须是对对象的引用。如果您对对象进行更改,您的函数需要 return 这个变量! Matlab 仅对输入对象的副本进行更改。此对象已丢失,除非您从函数中 return 它。

classdef uavclass
    % code
    methods
        function obj = uavclass(x,y,z)
            obj.position = [x,y,z];
        end
        function uav = mymethod(uav, arg1, arg2) % uav contains a reference to an instance of an object
            uav.minCruiseAlt = arg1;
            uav.maxCruiseAlt = arg2;
        end
    end
end