Matlab-OOP方法
我正在用MATLAB编写一些面向对象的程序。我目前正在创建一个类,如下所示: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
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