|
|
Propertie in Klasse wird nicht zugewiesen |
|
flashpixx |
Forum-Guru
|
|
Beiträge: 355
|
|
|
|
Anmeldedatum: 19.04.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 20.10.2008, 11:44
Titel: Propertie in Klasse wird nicht zugewiesen
|
|
|
|
|
Hallo,
ich habe in meiner Klasse folgendes Problem (Matlab 7.4), dass ich ein Property nicht zuweisen kann.
Die Properties sind so deklariert:
properties(GetAccess='private', SetAccess='private')
joMeasurement = [];
gnDatasetLength = 0;
gnDatasetPosition = 0;
end
Wenn ich nun diese Methoden habe:
function abc(this, data)
this.gnDatasetLength = data;
end
und dann eine Methode
function r = xyz(this)
r = this.gnDatasetLength;
end
und diese nun so aufrufe
myo = myObj();
myo.abc(123)
myo.xyz()
ist die Ausgabe immer 0. Eine Änderung des Wertes ist im Konstruktor möglich. Interessant ist auch dass, das Javaobjekt was in joMeasurement lesen und verändern lässt, wenn ich es über Getter / Setter lese / ändere.
Auffällig ist dann noch, wenn ich das Semikolon in beiden Methoden entferne, dass bei der Setter der richtige Wert in der Ausgabe erscheint, aber nicht in der Variablen.
Weiterhin ist mir noch auf, dass das bei allen Properties so ist, die ich zusätzlich deklariere. Im Grunde ist es so, als wären alle Werte Const bzw können nur im Konstruktor geändert werden
Ich hoffe jemand kann mir bitte helfen
Danke
Phil
|
|
|
|
|
joekey |
Forum-Century
|
|
Beiträge: 169
|
|
|
|
Anmeldedatum: 03.04.08
|
|
|
|
Wohnort: Wien
|
|
|
|
Version: 2011b
|
|
|
|
|
|
Verfasst am: 20.10.2008, 20:59
Titel:
|
|
|
|
|
Hallo Phill,
bin mir nicht sicher ob ich genau verstehe was du meinst, versuche es aber trotzdem erklären:
PROBLEM: du kannst die private Properties nicht setzen.
ERKLÄRUNG: das Verhalten der Properties ist korrekt. Du hast sie auf PRIVATE gesetzt. Somit sind sie ausschießlich von der Klasse selbst erreichber. Stelle dir mal vor du hast eine Klasse Haus. Deine privaten Properties sind Hauseinrichtung und Haussafe. Da es sich um PRIVATE properties handelt (sie sind im Haus abgeschlossen) kann man von außen (wenn du vor dem Haus stehst) auf sie nicht zugreifen. Diese Properties sind erreichbar ausschließlich von inneren des Hauses (quasi wenn du ein Schlüssel hast bist du berechtigt, das Haus zu betreten und das Einrichtung und Safe zu nutzen).
LÖSUNG: du hast zwei Möglichkeiten: entweder deklarierst du die Properties als PUBLIC, falls du von außen zugreifen willst. Oder sie bleiben PRIVATE und du kannst sie nur innerhalb der Klasse benutzen.
BEISPIEL:
Wie du in meinem Code siehst, alle Operationen passieren innerhalb der Klasse: setzen und auslesen des Wertes einer Varialer.
TEST:
joMeasurement
gnDatasetLength 0
gnDatasetPosition 0
joMeasurement
gnDatasetLength 99
gnDatasetPosition 0
Vesuchst du außerhalb der Klasse Variable zu setzen, bekommst du folgende Fehlermeldung:
??? Error using ==> set
Setting the 'gnDatasetLength' property of the 'deineKlasse' class is not allowed.
Hoffentlich konnte ich dir ein bißchen helfen.
LG Joe
|
|
|
flashpixx |
Themenstarter
Forum-Guru
|
|
Beiträge: 355
|
|
|
|
Anmeldedatum: 19.04.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 20.10.2008, 22:10
Titel:
|
|
Ich kenne mich durchaus in der OOP Programmierung aus und kenne deshalb die Unterschiede zwischen public, (protected) und private.
Es geht hier um folgendes Problem
einmal die Zuweisung "this.gnDatalength=length(daten)" und einmal das Bool bei If "this.gnDatalength > 0" funktionieren nicht. length liefert den korrekten Wert, er wird aber aus irgendwelchen Gründen nicht in gnDatalength gesetzt, gnDatalength bei der If Abfrage hat immer den Wert, der unter properties gesetzt wird bzw. auch mal testweise im Konstruktor.
Jeder Zugriff innerhalb irgendeiner Methode auf die ein weiteres privates Property schlägt in dem Sinne fehl, dass das Property immer den Wert zur Initialisierung der Klasse hat, selbst wenn es innerhalb der Klasse geändert wird. Selbst wenn das Property "public" ist ändert sich nichts an diesem Verhalten, es sieht so aus als wäre es "const" (readonly) deklariert
Danke
Phil
|
|
|
joekey |
Forum-Century
|
|
Beiträge: 169
|
|
|
|
Anmeldedatum: 03.04.08
|
|
|
|
Wohnort: Wien
|
|
|
|
Version: 2011b
|
|
|
|
|
|
Verfasst am: 21.10.2008, 19:52
Titel:
|
|
Hallo Phil,
ich kann das verhalten bei mir leider nicht bestätigen. Ich benutze aber 2008a. So weit ich weiß sind in 2007 nicht alle OOP Funktionalitäten implementiert (z.B. die statische Methoden). Ich habe folgendes Beispiel auf verschiedene Weisen getestet.
Vielleicht meldet sich jemand der noch 2007 benutzt und OO programmiert.
LG Joe
|
|
|
Titus |
Forum-Meister
|
|
Beiträge: 871
|
|
|
|
Anmeldedatum: 19.07.07
|
|
|
|
Wohnort: Aachen
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 29.10.2008, 11:12
Titel:
|
|
Hallo,
der grundlegende Unterschied zwischen Eurer beiden Klassen ist, dass Phil eine "Value class" und Joe eine "Handle class" entworfen hat. Das Problem hat nichts mit Zugriffsrechten zu tun.
Bei einer Handle-Class werden Objekte nicht kopiert, sondern nur Referenzen kopiert. Daher funktioniert auch sowas wie
Eine Value-Klasse funktioniert so nicht, sondern hier muss das geänderte Objekt (welches eine unabhängige Kopie ist!) wieder zugewiesen werden:
Ciao,
Titus
|
|
|
flashpixx |
Themenstarter
Forum-Guru
|
|
Beiträge: 355
|
|
|
|
Anmeldedatum: 19.04.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 18.11.2008, 11:13
Titel:
|
|
Danke für die Erklärung, hat geholfen
Phil
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|