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

Zugriff auf ein Objekt von Klasse B innerhalb von Klasse A

 

Martinuk
Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.07.2018, 16:17     Titel: Zugriff auf ein Objekt von Klasse B innerhalb von Klasse A
  Antworten mit Zitat      
Hallo,

ich kämpfe derzeit mit folgendem Problem. Ich habe im wesentlichen zwei Klassen erstellt. Die Klasse A (= meine Masterklasse) und die Klasse B (= eine Art Hilfsklasse auf deren Eigenschaften & Methoden ich in Klasse A zugreifen möchte). Die gesamten Funktionsaufrufe sowie das Setzen und Holen von Eigenschaften wird über Klasse A erledigt. Klasse B dient nur als Lieferant bestimmter Informationen, bzw. werden Teilinformationen von Klasse A nach Klasse B ausgelagert.

Mein Ansatz wäre, dass ich die Instanzen von Klasse B als Eigenschaften von Klasse A ablege. Als Benutzer soll man dann Zugriff (Get/Holen) haben, aber diese Variablen nicht verändern können.


Ich möchte in Klasse A mehrere Instanzen von Klasse B erstellen, Daten zuweisen und später in Klasse A mit diesen Daten arbeiten.

Hier mal ein vereinfachtes Beispiel

Code:
classdef A < handle
    properties
        x
        Bdata
    end
   
    methods
        function obj = A(x)
            if nargin == 1
                obj.x = x;
                obj.Bdata = B(5);
            else
                error('Number of expected input arguments: 1')
            end
        end
    end
end


Code:
classdef B < handle  
    properties %(SetAccess = public)
        y
    end
   
    methods
        function obj = B(y)
            if nargin == 1
                obj.y = y;
            else
                error('Number of expected input arguments: 1')
            end
        end
    end
end


Wie man anhand des Beispiels sehen kann, erstelle ich in Klasse A ein Objekt vom Typ Klasse B und kann auch über den Konstruktoraufruf ein Wert auf die Variable y schreiben.

Nur kann hier der Wert von aussen geändert werden mit zB.

Code:

>> a = A(1)

a =

  A with properties:

        x: 1
    Bdata: [1×1 B]

>> a.Bdata.y = 100

a =

  A with properties:

        x: 1
    Bdata: [1×1 B]

>> a.Bdata

ans =

  B with properties:

    y: 100
 


1. Kann man den Zugriff von aussen irgendwie verhindern?
2. Wie kann ich auf 'y' von Klasse B zugreifen (innerhalb von Klasse A) ohne Vererbung (A < B))

In der Dokumentation von MATLAB habe ich bisher nicht gefunden was ich brauche. Hoffentlich kann mir jemand von euch helfen.

Danke.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.428
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.07.2018, 17:06     Titel:
  Antworten mit Zitat      
Hallo,

1. über Attribute
Code:
   properties (SetAccess = private)
        Bdata
    end


2.
Code:
y = a.Bdata.y


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Martinuk
Themenstarter

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.07.2018, 17:19     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für die schnelle Antwort. In diesem Fall glaube ich funktioniert dein Vorschlag nicht.

Es ist richtig, dass ich wenn ich (SetAccess = private) verwende ich nicht mehr z.B.
Code:
>> a.Bdata = 1
You cannot set the read-only property 'Bdata' of A.
setzen kann. Aber sehr wohl kann ich 'y' von Klasse B verändern (was ich ja nicht möchte)
Code:
>> a.Bdata.y = 50

a =

  A with properties:

        x: 1
    Bdata: [1×1 B]

>> a.Bdata

ans =

  B with properties:

    y: 50


Ich glaube ich habe gerade die Lösung zu meinem Problem gefunden. Es liegt scheinbar an den Zugriffsrechten der Properties von Klasse B. Wenn ich diese auf (SetAccess = ?A) setze scheint man von aussen keinen Zugriff mehr zu haben. Wenn ich das richtig verstehe können die Eigenschaften von Klasse B können dann lediglich innerhalb von Klasse A verändert werden, genau das was ich möchte.

Code:
a =

  A with properties:

        x: 1
    Bdata: [1×1 B]

>> a.Bdata = 5
You cannot set the read-only property 'Bdata' of A.
 
>> a.Bdata.y = 50
You cannot set the read-only property 'y' of B.


Eine generelle Frage zu diesem Ansatz. Entspricht es deiner Meinung nach dem OOP-Konzept, Instanzen von Klassen innerhalb von Variablen anderer Klassen zu verwenden?

Danke, Martinuk
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.428
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.07.2018, 19:25     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Eine generelle Frage zu diesem Ansatz. Entspricht es deiner Meinung nach dem OOP-Konzept, Instanzen von Klassen innerhalb von Variablen anderer Klassen zu verwenden?

Ja, wird auch als Aggregation bezeichnet.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Martinuk
Themenstarter

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.07.2018, 20:10     Titel:
  Antworten mit Zitat      
Super, danke.
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.