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

Ist dieses OOP-Konzept sinnvoll bzw. erlaubt?

 

Giorgio
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 05.09.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.09.2017, 15:26     Titel: Ist dieses OOP-Konzept sinnvoll bzw. erlaubt?
  Antworten mit Zitat      
Hallo,

bin Anfänger was das Programmieren angeht und wage mich gerade an OOP.

Nun habe ich zwei Klassen geschrieben: Taster und Lampe.

Wenn ich ein Taster-Objekt erzeuge und seine Methode schalten aufrufe, soll bei einem Lampe-Objekt der Zustand (an/aus) gewechselt werden.

Code einfügen:
Code:
classdef Taster < handle
   
    properties (Access = private)
        l = [] %listenerObj
        lampe = []; %Lampen-Obj
    end
   
    methods
        function obj = Taster()
            obj.l = addlistener(obj,'signal',@schalten);
        end
       
        function [] = aktivieren(obj) %simuliert drücken des Tasters
            notify(obj, 'signal');
        end
       
        function obj = verbinden(obj, lampe) %übergeben von Lampen-Objekt an Taster
            obj.lampe = lampe;
        end
       
        function [] = schalten(obj, evtData) %simuliert den Ein-/Ausschaltvorgang
            if (obj.lampe.zustand == 0)
                obj.lampe.zustand = 1;
            elseif (obj.lampe.zustand ==1)
                obj.lampe.zustand = 0;
            end
            disp(obj.lampe.zustand);
        end
    end
    events
        signal
    end
end
 
(alt+c)

und

Code einfügen:
Code:
classdef Lampe < handle
   
    properties(Access = private)
        zustand;
    end
   
    methods
        function obj = Lampe()
            obj.zustand = 0;
        end
       
    end
end
 
(alt+c)

Habe erst versucht das mithilfe eines Events zu programmieren. Hat auch geklappt, jedoch musste ich dem Taster-Objekt dafür eine Referenz auf das Lampen-Objekt geben und diese in den properties speichern. Aber eigentlich ist ja das Prinzip von OOP, dass jedes Objekt nur seine eigenen Eigenschaften kennt, oder? Würde heißen keine Eigenschaft, die ein Lampenobjekt beinhaltet.

Außerdem ist bei mir der Taster gleichzeitig Ereignisquelle und Listener. Es wird erstmal die Methode
Code:
aktivieren()
aufgerufen um dann über
Code:
die Methode
Code:
schalten()
aufzurufen. Eigentlich soll aber die Lampe dem Taster quasi zuhören, oder? (Ich weiß ich kann auch direkt über
Code:
schalten()
das Lampen-Objekt verändern, aber ich würde mich freuen, wenn mir jemand das Event-Prinzip an dem Beispiel erklären könnte! Oder kann ich das mit den Events auch einfach umgehen und das immer so machen?!)

Ist es erlaubt oder sinnvoll das so zu programmieren, wenn man nach den Regeln der OOP geht? Ich Will lernen wie man es richtig macht, bin mir aber nicht so sicher. Also vielen Dank schon mal!
Private Nachricht senden Benutzer-Profile anzeigen


Giorgio
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 05.09.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.09.2017, 15:50     Titel:
  Antworten mit Zitat      
Die Zugriffsrechte für den Zustand des Lampen-Objekts müssen natürlich public sein sonst klappts nicht
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 13.09.2017, 21:21     Titel:
  Antworten mit Zitat      
Zitat:
Aber eigentlich ist ja das Prinzip von OOP, dass jedes Objekt nur seine eigenen Eigenschaften kennt, oder? Würde heißen keine Eigenschaft, die ein Lampenobjekt beinhaltet.

In OOP sollte man nicht direkt auf die Properties zugreifen, sondern über Methoden, weil es bietet mehr Sicherheit
Also am besten die Klasse Lampe weitere Methoden einfügen
Code:

classdef Lampe < handle
    properties (Constant)
        ON  = 1;
        OFF = 0
    end
    properties(Access = private)
        zustand;
    end
   
    methods
        function obj = Lampe()
            obj.zustand = 0;
        end
        function state = istEin(obj)
            state = obj.zustand == obj.ON;
        end
        function ein(obj)
            obj.zustand = obj.ON
        end
        function aus(obj)
            obj.zustand = obj.OFF
        end        
    end
end
 


Schalter braucht kein Listener, da reicht auch eine Funktion, z.B Schalter drücken.
Listener braucht man um z.B Properties wie Zustand der Lampe zu überwachen, wenn Zustand sich ändert, dann kann z.B Textausgabe machen.
Die Ereignisse sind gut, um z.B aus einer Klasse in anderer Klasse das Ereignis auszulösen.
Beispiel für Ereignis konnte mehrere Schalter in Verbindung mit Relais sein.
z.B in Relais gibt es ein Event, welcher Schalter beim Drücken auslösen. Wenn Relais geschlossen ist, dann Licht ein, wenn auf Licht aus.

Code:
classdef Taster < handle
   
    properties (Access = private)
        lampe = [];
    end
   
    methods
        function obj = Taster()
           
        end
             
        function obj = verbinden(obj, lampe) %übergeben von Lampen-Objekt an Taster
            obj.lampe = lampe;
        end
       
        function press(obj)
            if obj.lampe.istEin()
                obj.lampe.aus();
            else
                obj.lampe.ein();
            end
        end

    end
end
Private Nachricht senden Benutzer-Profile anzeigen
 
Giorgio
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 05.09.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.09.2017, 07:56     Titel:
  Antworten mit Zitat      
Okay, verstanden! Das Beispiel mit dem Relais hat mir geholfen!

Vielen Dank für die Hilfe
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.