WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Properties zwischen verschiednen Instanzen lesen

 

Scoop

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2016, 14:04     Titel: Properties zwischen verschiednen Instanzen lesen
  Antworten mit Zitat      
Hallo,
ich stehe gerade auf'm Schlauch. Ich dachte, dass mein Problem trivial ist, allerdings habe ich nach stundenlager recherche noch keine Lösung finden können.

Ich habe 2 Klassen und erzeuge je eine Instanz:
Code:

classdef class1 < handle
   
    properties(Access=public)
   v=99
    end
   
    methods
        function foo1 = get.v(obj)
            foo1 = obj.v
        end
    end
   
end
 


Code:

test = class1
 


Code:

classdef class2 < handle
    properties(Access=public)
   v_neu
    end
   
    methods
            function obj = foo(test)
                obj.v_neu = test.foo1
            end
    end
   
end
 

Code:

S = class2
 


Nun möchte ich die Property v der einen Instanz in die Property v_neu der anderen Instanz schreiben.

Code:


Hier bekomme ich die Meldung:
No appropriate method, property, or
field 'foo1' for class 'classField'.

Kann mir jemand sage, wo mein Denkfehler ist?
Ich habe jetzt alle Möglichkeiten ausprobiert, die mir in den Sinn gekommen sind. Bisher ohne Erfolg. Die Property im cmd auslesen klappt ohne Probleme. Ich möchte aber, dass die Instanz der Klasse class2 sich den Wert aus der Instanz der Klasse class1 automatisch hohlt.
Ich habe geschätzte 100 Artikel durchgelesen, aber keinen hilfreichen Hinweis auf mein Vorhaben gefunden. Ein paar Stichworte nach denen ich suchen kann, wären schon hilfreich.
Vielen Dank im vorraus!

Gruß,
Scoop


Scoop

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2016, 14:15     Titel:
  Antworten mit Zitat      
ist der kasusknaktus Vererbung? Ist es nicht möglich eine öffentliche property zu lesen, ohne dass eine Vererbung besteht?
 
punkNgrind
Forum-Century

Forum-Century


Beiträge: 136
Anmeldedatum: 10.03.11
Wohnort: Hamburg
Version: R2014b
     Beitrag Verfasst am: 23.08.2016, 14:33     Titel:
  Antworten mit Zitat      
Bei dem was du beschreibst, kannst du das Attribute 'v_neu' der class2 direkt ohne eine Methode beschreiben:

Code:

>> S.v_neu = test.v

foo1 =

    99


S =

  class2 with properties:

    v_neu: 99
 


Weiterhin ist die Methode 'foo' der 'class2' auch fehlerhaft:

Code:

classdef class2 < handle
    properties(Access=public)
   v_neu
    end
   
    methods
      function obj = foo(obj, test)  % obj der eigentlichen class2 muss mit übergeben werden
          obj.v_neu = test.v % Zurgriff auf das Attribute 'v' der Klasse 'class1' das du mit test übergibst
      end
    end
   
end
 


Zuletzt bearbeitet von punkNgrind am 23.08.2016, 14:35, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.08.2016, 14:33     Titel:
  Antworten mit Zitat      
Hallo,

eine Eigenschaft foo gibt es ja auch nicht, sondern nur v (class1) und v_neu (class2). Public Properties können überall abgefragt werden.

Wenn in einem Objekt wirklich automatisch auf Änderungen einer Eigenschaft in einem anderen Objekt reagiert werden soll (z.B. Viewer), dann bräuchtest du Events und Listeners.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Scoop

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2016, 11:05     Titel:
  Antworten mit Zitat      
Vielen Dank für Eure Antworten und eure schnellen Antworten!

Jetzt hatte ich erst gedacht, dass ich den Wald vor lauter Bäumen nicht sehe. Allerdings bereitet mir das folgende immer noch Probleme:

1. Ich erstelle eine Instanz der Klasse 1
2. Ich erstelle eine Instanz der Klasse 2, eine Property der Instanz der Klasse 2 soll den Wert einer Property der Instanz aus Klasse 1 übernehmen.
Jetzt habe ich euch so verstanden, dass ich ganz einfach auf die Property der Instanz der ersten Klasse zugreifen kann. Das funktioniert bei mir aber nicht.

Wenn ich es in einer Methode versuche...
Code:

methods
            function obj = foo(test)
                obj.v_neu = test.v
            end
end
 

bekomme ich die Meldung:
No appropriate method, property, or
field 'v' for class 'classSource'.

Wenn ich versuche die Property der zweiten Klasse direkt mit dem Wert der Property aus der Instanz der ersten Klasse zu beschreiben, bekomme ich schon bei der Instanzieierung der 2. Klasse folgende Meldung:
Code:

    properties
        V = test.vSound
    end
 

Meldung:
Error using classSource
Unable to update the class
'classSource' because the new
definition contains an error:
The class test has no Constant
property or Static method named 'v'.

Aber das hat sie doch!

Vielleicht kann mir jemand ein einfaches Beispiel zeigen, wie das funktioniert?
Ich versuche die Problemstellung nochmal zu beschreiben:

Ich habe 2 Klassen.
Zuerst erstelle ich eine Instanz der Klasse 1.
Diese Klasse hat Properties mit festgelegten Werten.
Als nächstes möchte ich eine Instanz der Klasse 2 erstellen.
Einige Properties dieser Instanz sollen die Gleichen Werte annehmen, wie die Properties der Instanz der Klasse 1.

Ich kann gar nicht glauben, dass ich schon etliche Stunden mit recherche verbracht habe, ohne das Problem zu verstehen oder eine Lösung zu finden.
In der cmd kann ich die Werte natürlich ohne Probleme lesen oder Beschreiben. Ich möchte aber, dass die Instanz die Werte beim Erstellen eben dieser übernimmt.

Falls jemand noch einige Sachdienliche Hinweise geben könnte, wäre ich sehr Dankbar.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.08.2016, 11:16     Titel:
  Antworten mit Zitat      
Hallo,

die zweite Variante ist nur sinnvoll, wenn es ein constant oder static Property gibt - also ein Property, das bei allen Klasseninstanzen gleich ist.

Es wäre hilfreich, wenn du ein komplett lauffähiges Minimalbeispiel für die erste Variante zur Verfügung stellst. Es ist recht verwirrend, wenn Beispiel (Eigenschaft vSound) und Fehlermeldung (Eigenschaft v) nicht zusammenpassen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Scoop

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2016, 11:42     Titel:
  Antworten mit Zitat      
Hallo Harald,

ja, du hast natürlich recht. Ich habe hier jetzt zig- variationen ausprobiert, die Code-Schnipsel passen nicht zusammen.
Kennt jemand Beispiele, wie Datenaustausch zwischen Instanzen in Matlab funktionieren kann? Kann doch jetzt nicht so speziell sein. Ist mein konzeptioneller Ansatz so daneben?

Ich werde den OOP Ansatz erstmal verwerfen, und das Programm prozedural runterschreiben. Das ist zwar nicht schön für die Präsentation, aber offensichtlich fehlt mir für Objektorientierung einiges an Wissen. Habe gerade leider keine Zeit, dafür so viele Stunden zu opfern.

Wenn es zeitlich passt, komme ich vielleicht nochmal verständlicher auf das Thema zurück.
Vielen Dank nochmal für eure schnellen Antworten und Sorry, dass ich mir bei der Fragestellung so wenig Mühe gegeben habe.

sonnigen Gruß,
Scoop
 
Scoop

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2016, 11:45     Titel:
  Antworten mit Zitat      
jetzt hab ich den wahrscheinlich gesuchten Hinweis von Harald fast nicht richtig wahrgenommen. Ich glaube der Hinweis auf const, war das was ich suchte.

Danke!
 
punkNgrind
Forum-Century

Forum-Century


Beiträge: 136
Anmeldedatum: 10.03.11
Wohnort: Hamburg
Version: R2014b
     Beitrag Verfasst am: 24.08.2016, 11:50     Titel:
  Antworten mit Zitat      
Klasse 1:

Code:

classdef class1 < handle
   
    properties(Access=public)
      testvariabel = 99;
    end
   
    methods
      function testvariabel = get.testvariabel(obj)
        testvariabel = obj.testvariabel;
      end
    end
end
 


Klasse 2:
Code:

classdef class2 < handle
  properties(Access=public)
    testvariabel_neu;
  end

  methods
    function obj = copyTestvariabel(obj, InstanzDerKlasse1)
      obj.testvariabel_neu = InstanzDerKlasse1.testvariabel;
    end
  end
end
 


Eingabe im Command Window mit Nutzung der Methode 'copyTestvariabel':
Code:

>> InstanzDerKlasse1 = class1;
>> InstanzDerKlasse1.testvariabel

ans =

    99

>> InstanzDerKlasse2 = class2;
>> InstanzDerKlasse2.testvariabel_neu

ans =

     []

>> InstanzDerKlasse2.copyTestvariabel(InstanzDerKlasse1);
>> InstanzDerKlasse2.testvariabel_neu

ans =

    99
 


oder mit direkten Zugriff auf 'properties':

Code:

>> InstanzDerKlasse1.testvariabel = 1;
>> InstanzDerKlasse1.testvariabel

ans =

     1

>> InstanzDerKlasse2.testvariabel_neu = InstanzDerKlasse1.testvariabel;
>> InstanzDerKlasse2.testvariabel_neu

ans =

     1

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.