Matlab-OOP方法

Matlab-OOP方法,matlab,class,oop,object,simulation,Matlab,Class,Oop,Object,Simulation,我正在用MATLAB编写一些面向对象的程序。我目前正在创建一个类,如下所示: classdef uavclass properties %all properties of the uav position = [0,0,0] charge = 100; destination = [0,0,0]; maxVertClimb = 2; maxHorizSpeed = 5; se

我正在用MATLAB编写一些面向对象的程序。我目前正在创建一个类,如下所示:

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
我可以通过调用以下命令在
位置创建
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
对象上使用任何类型的方法时,我都会得到一个错误。例如,只需尝试更改某些
无人机的
传感器范围

    function changesense(b) 
        uav.sensorRange = b
    end
还尝试了
uavclass.sensorRange
。我尝试使用
uav1.changesense(5)
调用它,但它不会更改值。我也尝试过使用和不使用
(静态)
方法,以及
changesense(uav1,b)


我做错了什么?

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

function obj = changesense(obj, b) 
    obj.sensorRange = b
end
这就是它在MATLAB中的工作原理。 这里还有一些简单的OOP示例: 本文件介绍了不同类型的方法: 如果您想使用静态方法(不在对象的上下文中工作,则不需要第一个参数)

这与Python中的
self
是相同的概念


关于matlab中的OOP,您想知道的一切都在本主页的任何子页中有完整的文档:

有几种方法可以解决这个问题。“又快又脏”——最重要的一个是用以下内容注释
属性
部分:

properties (Access = public)
这样,您就可以像读写结构一样读写对象属性(或“字段”)


几点注意:

  • 您可以创建多个
    方法
    属性
    块,每个块都有自己的属性。例如,通过这种方式,您可以将一些
    方法
    块包含
    静态
    方法,而其他方法可以定义
    私有
    等。我建议将属性分为两个块,其中第一个块包含一些常量,另一个块包含实际的“实例变量”:

  • Accessor和Mutator方法:如中所述,您可能希望使用方法来更改和访问实例字段的值,因为从长远来看,这些方法通常提供了更大的灵活性。您可以在Bloch的有效Java中了解更多信息“第14项:在公共类中,使用访问器方法,而不是公共字段”

  • 我认为对包含构造函数的
    方法
    块进行注释是不正确的。我这样说只是因为它在MATLAB的例子中是这样出现的,我相信这与子类化某些“便利类”有关,这些“便利类”要求构造函数块没有属性,但很可能还有另一种解释


  • 我认为对代码进行简单的更改就可以了

    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
    
    请注意,函数的名称与类的名称相同。这表明该函数是一个构造函数。您应该删除
    methods
    中的
    Static
    属性。构造函数还必须遵循几个规则。其中之一是函数必须返回对构造函数创建的对象的引用,在您的例子中,它是
    uav
    ,但它可以是任何对象。我通常使用
    obj

    请记住,您已决定公开您的财产。否则,您可以使用以下属性之一:
    private
    protected
    并控制setter或getter对属性的访问

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

    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
    

    感谢Tim的回复,我尝试创建了一个不同的方法,function changeCharge(uav,b)uav.charge=b end,并尝试使用uav1.changeCharge(50)和changeCharge(uav1,50),以及changeCharge(uav,50),最后是uav.changeCharge(uav1,50),但是它仍然不会修改对象uav1的变量。您还必须返回对象
    obj
    frmo方法,我编辑了我的答案。请参阅此处的详细信息:。在您的情况下,这将产生:
    函数self=changecheage(self,b)self.charge=b;结束
    。我宁愿使用
    self
    obj
    作为self对象的通用术语(始终),而不是
    uav
    ,因为
    uav
    可能会让你以后感到困惑,因为你还可以命名你的其他变量
    uav1、uav2等。
    你应该投票并接受答案。看起来你只是在问问题,但从来没有回报(通过查看你的个人资料页面)。因此,如果我的答案对你有帮助,请做适当的事情。你的方法与类名同名。这意味着该方法是一个构造函数。我不认为构造函数可以在
    静态
    部分中,而是在公共访问的
    方法
    部分中。构造函数必须返回对正在创建其实例的对象的引用;在您的情况下,它是
    uav
    。为任何属性指定任何值都将更改这些属性和对象的状态。
    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