2016-05-14 10 views
2

Ich arbeite an einigen OOP in MATLAB. Ich bin gerade dabei eine Klasse wie folgt:Matlab - OOP Methoden

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 

ich uav bei einer position durch den Aufruf erstellen:

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); 

Jedes Mal, wenn ich versuche, auf den uav Objekte jede Art von Verfahren zu verwenden ich eine bekommen Error. Ein Beispiel versucht, einfach die sensorRange von uav

function changesense(b) 
     uav.sensorRange = b 
    end 

haben auch uavclass.sensorRange versucht, einige ändern. Ich versuche, dies mit uav1.changesense(5) aufzurufen, aber es ändert den Wert nicht. Ich habe auch mit und ohne (Static) für Methoden und changesense(uav1,b) usw. versucht.

Was mache ich falsch?

+0

Sie sollten eine Antwort erhalten und akzeptieren. Es scheint, dass Sie nur Fragen stellen, aber nie etwas zurückgeben (indem Sie auf Ihre Profilseite schauen). Also, wenn meine Antwort Ihnen geholfen hat, machen Sie bitte die entsprechenden Dinge. – tim

+0

Ihre Methode hat den gleichen Namen wie der Klassenname. Das bedeutet, dass diese Methode ein Konstruktor ist. Ich glaube nicht, dass Konstrukteure innerhalb der 'Static'-Sektion sein können, sondern eher im' Method'-Bereich des Public Access. Konstruktoren müssen einen Verweis auf ein Objekt zurückgeben, dessen Instanz erstellt wird. in deinem Fall ist es 'uav'. Wenn Sie einer Eigenschaft einen Wert zuweisen, werden diese Eigenschaften und der Status Ihres Objekts geändert. – Celdor

Antwort

2

Sie müssen immer einen ersten Parameter für jede Methode haben, die das Objekt definiert, das geändert wird. Das heißt, Sie müssen es wie folgt umzusetzen:

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

Dies ist nur das Konzept, wie es in MATLAB arbeitet. Schauen Sie sich hier auch einige einfache OOP-Beispiele an: https://de.mathworks.com/help/matlab/matlab_oop/getting-familiar-with-classes.html und diese Doku über verschiedene Methodentypen: https://de.mathworks.com/help/matlab/matlab_oop/specifying-methods-and-functions.html#brqy87j Falls Sie eine statische Methode verwenden möchten (funktioniert nicht im Kontext des Objekts, benötigen Sie NICHT das erste Argument).

Es ist das gleiche Konzept wie self in Python.

Und alles, was Sie wollen über OOP in Matlab wissen, ist in jeder Unterseite dieser Hauptseite vollständig dokumentiert: https://de.mathworks.com/help/matlab/object-oriented-programming.html

+1

Danke für die Antwort Tim, i versucht, ein anderes Verfahren zu schaffen, Funktion changeCharge (UAV, b) uav.charge b = Ende und versuchte es mit uav1.changeCharge (50) sowie changeCharge Aufruf (uav1 , 50), und auch changeCharge (uav, 50) und schließlich uav.changeCharge (uav1,50), aber es ändert immer noch nicht die Variable des Objekts uav1. – Vladamir

+0

Sie müssten auch das Objekt 'obj' aus der Methode zurückgeben, ich habe meine Antwort bearbeitet. Weitere Informationen finden Sie hier: https://de.mathworks.com/help/matlab/matlab_oop/ordinary-methods.html. In Ihrem Fall würde dies ergeben: 'function self = changeCharge (self, b) self.charge = b; Ende. Ich würde "self" oder "obj" lieber als allgemeine Begriffe für das Selbstobjekt (immer) anstelle von "uav" verwenden, weil "uav" Sie später verwirren könnte, weil Sie auch Ihre anderen Variablen "uav1, uav2" nennen usw ... ' – tim

0

Es gibt mehrere Ansätze für dieses Problem. Die „quick-and-dirty“ -est man den properties Abschnitt wird mit Anmerkungen versehen würde mit dem folgenden:

properties (Access = public) 

diese Weise erhalten Sie die die Objekteigenschaften (oder „Felder“) lesen und schreiben können, als wäre es ein struct.


Mehrere Hinweise:

  1. Sie können mehrere methods und properties Blöcke erstellen, jede mit ihren eigenen Attribute. Zum Beispiel können Sie auf diese Weise einige methods Blöcke zu Static Methoden enthalten, während andere private usw. definieren können. Ich würde vorschlagen, Ihre Eigenschaften in zwei Blöcke zu trennen, wo die 1 st enthält einige Konstanten und die andere enthält Ihre tatsächliche "Instanz Variablen ":

    properties (Constant = true) %// Class constants 
        MAX_VERT_CLIMB = 2; 
        MAX_HORIZ_SPEED = 5; 
        ... 
    end 
    
    properties (Access = public, Constant = false) %// Instance variables 
        [email protected] scalar = []; 
        [email protected] vector = []; 
        ... 
    end 
    
  2. Accessor & Mutator-Methoden: wie in Tim's answer erwähnt könnte man wollen Methoden verwenden und die Werte der Instanzfelder zugreifen zu ändern, da diese in der Regel mehr Flexibilität auf lange Sicht bieten.Sie können mehr darüber in z.B. Blochs Wirksames Java "Punkt 14: Verwenden Sie in öffentlichen Klassen Accessormethoden, keine öffentlichen Felder".

  3. Ich glaube nicht, dass es richtig ist, den methods Block, der den Konstruktor mit einem Method Attributes enthält, annotieren. Ich sage das nur, weil es so in MATLABs Beispielen erscheint. Ich glaube, das hat etwas damit zu tun, bestimmte "Bequemlichkeitsklassen" zu unterklassifizieren, die erfordern, dass der Konstruktorblock keine Attribute hat, aber es kann sehr wohl eine andere Erklärung geben.

0

Ich denke, eine einfache Änderung in Ihrem Code sollte tun.

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 

Beachten Sie, dass ein Name Ihrer Funktion derselbe wie der Name einer Klasse ist. Das deutet darauf hin, dass diese Funktion ein Konstruktor ist. Sie sollten das Static-Attribut in methods entfernen. Konstruktoren müssen auch ein paar Regeln befolgen. Eine davon ist, dass eine Funktion einen Verweis auf ein Objekt zurückgeben muss, das ein Konstruktor erstellt, in Ihrem Fall ist es uav, aber es könnte alles sein. Ich verwende normalerweise obj.

Denken Sie daran, dass Sie sich entschieden haben, Ihre Objekte öffentlich zu machen. Andernfalls können Sie eines der folgenden Attribute verwenden: private oder protected und den Zugriff auf Eigenschaften durch Setter oder Getter steuern.

Wenn Sie eine andere Methode in Ihrer Klasse definieren, muss das erste Argument eine Referenz auf Ihr Objekt sein. Wenn Sie Änderungen an Ihrem Objekt vornehmen, muss Ihre Funktion diese Variable zurückgeben! Matlab nimmt Änderungen nur an einer Kopie eines Eingabeobjekts vor. Dieses Objekt ist verloren, es sei denn, Sie geben es von einer Funktion zurück.

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