{lang: 'de'}
Flashhilfe.de - Flash Community

Vererbung im MVC möglich? [Flash 11]

 


AntwortenRegistrieren Seite1  

Rotblitz#1
Benutzerbild von Rotblitz
Beiträge: 46
Wohnort: Hamburg
Registriert: May 2009

14.02.2012, 23:59

Moin,
also ich habe folgendes Problem:
Ich Habe ein MVC-Konstrukt aufgebaut, das von allen anderen Objekten in meinem Spiel geerbt werden kann.

Das heißt die Superklassen "HauptController", "HauptView" und "HauptModel" beinhalten schon Funktionen und Eigenschaften, die jedes Objekt auch haben soll.

Nun sollen aber die Unterklassen wie z.B. "AutoController" (erbt von HauptController) ein erweitertes umfangreicheres Model haben als nur "HauptModel".

Da aber im Konstruktor von "HauptController" die view und das Model (jeweils die oben genannten Superklassen) installiert werden, kann man nicht in dem Unterobjekt AutoController auf Eigenschaften  von "AutoModel" zugreifen.

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class HauptController
   {
        public var view:HauptView = new HauptView();
        public var model:HauptModel = new HauptModel();
        
       public function HauptController()
            {
 
                   model.registriere(view);
                   view.model = this.model;
           
            }
}


ActionScript:
1
2
3
4
5
6
7
8
9
10
11
public class AutoController extends HauptController
   {
        
        public function AutoController(argAutoMarke:String)
        {
           super();
           this.model = new AutoModel;
                          //Das geht nicht da AutoMarke nicht bekannt ist (model ist halt "nur" vom Typ "HauptModel")
         model.AutoMarke = argAutoMarke;
        }
}


Weiß jemand Rat?

Angehängte Dateien:
Bild UnbenannteZeichnung.jpg20.32 KB
Schlagwörter: MVC, Vererbung
valuee#2
Benutzerbild von valuee
Beiträge: 133
Wohnort: Straight Outta Berlin-City
Registriert: Aug 2006

15.02.2012, 14:20

Du könntest z.B. in AutoController so etwas machen:

ActionScript:
1
2
3
private function get myModel():AutoModel{
     return AutoModel(this.model);
}


und dann this.myModel statt this.model verwenden.
valuee#3
Benutzerbild von valuee
Beiträge: 133
Wohnort: Straight Outta Berlin-City
Registriert: Aug 2006

15.02.2012, 14:49

Was mir noch auffällt:

Im HauptController-Konstruktor rufst du model.registriere(view); auf und danach erzeugst du in der Unterklasse eine neue Model-Instance. Du musst also den super-Aufruf später machen:

ActionScript:
1
2
this.model = new AutoModel;
super();


Aus MVC-Sicht ist allerdings eh nicht gut, dass ein Model seine View kennt...
Rotblitz#4
Benutzerbild von Rotblitz
Beiträge: 46
Wohnort: Hamburg
Registriert: May 2009

Themenautor/in

15.02.2012, 17:26

Danke Valuee für die klare Antwort.

Allerdings bin ich mir nicht sicher ob das der richtige Weg sein kann. Wenn ich per "get myModel()" mir da model zurückgeben lasse, dann bekomm ich ja ein Model vom Typ "HauptModel" gefastet als "AutoModel" zurück.

Mir geht's dann ja aber darum, auch Werte zu verändern vom AutoModel wie zum Beispiel "AutoMarke:String" was ja nur im AutoModel steht und somit könnte ich das neue Model dann ja nicht mehr "setzen", also quasi:

ActionScript:
1
2
3
4
5
public function set myModel(argModel:AutoModel)
{
      //Geht nicht da this.Model ja immer noch nur vom Typ "HauptModel" ist und argModel "AutoModel"
    this.model = argModel;
}


Bezüglich des model.registriere(view) stimmt das natürlich, dass da Model keine View "direkt" kennt.
Ich benutzte aber hier in der Praxis das Überwacher-Muster welches somit registriere(), entferne() und informiere() an Model vererbt. :)
valuee#5
Benutzerbild von valuee
Beiträge: 133
Wohnort: Straight Outta Berlin-City
Registriert: Aug 2006

15.02.2012, 17:48

wenn AutoModel von HauptModel erbt (davon bin ich ausgegangen), sollte die Zuweisung this.model = argModel; funktionieren.
Rotblitz#6
Benutzerbild von Rotblitz
Beiträge: 46
Wohnort: Hamburg
Registriert: May 2009

Themenautor/in

15.02.2012, 18:48

Hmm, also ich versteh das nicht: MyModel macht doch nichts anderes, als this.model zu fasten und zurückzugeben. Dann kann ich doch aber nicht von einer anderen x-beliebigen Klasse aus auf das object cAuto (Instanz von AutoController) Daten verändern im Sinne von

ActionScript:
1cauto.myModel.autoMarke = "Seifenkiste"


Was würde in diesem Moment geschehen? Erst holt er sich model (AutoModel) und schreibt dann Werte hinein? Ja aber wohin? wenn ich daraufhin noch mal auf myModel zugreife und er wieder nur this.model als AutoModel zurückgibt, dann dürfte da "Seifenkiste" ja nicht mehr drinstehen, oder?

ActionScript:
1
2
3
cauto.myModel.autoMarke = "Seifenkiste";
...
trace(cauto.myModel.autoMarke); //Hier kommt dann doch nicht Seifenkiste heraus...
valuee#7
Benutzerbild von valuee
Beiträge: 133
Wohnort: Straight Outta Berlin-City
Registriert: Aug 2006

16.02.2012, 10:12

Ich geh mal von deinem ersten Beispiel aus:
   
ActionScript:
1
2
3
4
5
6
7
8
9
10
public class HauptController  {
      public var view:HauptView = new HauptView();
      public var model:HauptModel = new HauptModel();
         
      public function HauptController()
      {
          model.registriere(view);
          view.model = this.model;
      }
}



ActionScript:
1
2
3
4
5
6
7
8
public class AutoController extends HauptController{
      public function AutoController(argAutoMarke:String)
      {
          super();
          this.model = new AutoModel();         
          model.AutoMarke = argAutoMarke;
      }
}


Was paasiert hier, wenn du eine Instance von AutoController erstellst? Model bekommt eine Instance von Hauptmodel und wird registriert. Dirket im Anschluss erhält model jedoch eine Instance von AutoModel im AutoController-Konstruktor. Damit spielt die Hauptmodel-Instance (in diesem Controller) erst mal keine Rolle mehr. In model ist jetzt ein Objekt vom Typ AutoModel, dass sich aber wie ein Hauptmodel verhält. Durch den Cast nach AutoModel kannst du auch auf die Funktionen und Eigenschaften von AutoModel zugreifen. Liegt in deinem Model jedoch eine Objekt vom Typ Hauptmodel würde dieser Cast fehlschlagen (Laufzeitfehler). In diesem dargestellten Fall sehe ich hier aber kein Problem.

Fazit: Es gibt in deinem Controller EINE AutoModel-Instance, deren Werte du beliebig verändern kannst. Du kannst das Objekt vom Typ AutoModel, Hauptmodel oder auch Object zurückgeben und hättest jeweils Zugriff auf die Funktionen und Eigenschaften die dieser Typ bereit stellt. Die anderen Eigenschaften sind dann nicht sichtbar, aber gehen nicht verlohren.

Oder habe ich dein Problem falsch verstanden...?
Geändert von valuee am 16.02.12 um 10:18 Uhr
Rotblitz#8
Benutzerbild von Rotblitz
Beiträge: 46
Wohnort: Hamburg
Registriert: May 2009

Themenautor/in

22.02.2012, 21:38

Also das scheint echt zu funktionieren :)

Echt besten Dank.

Nur schein ich gerade zu merken, dass ich noch nicht 100% verstanden habe was
new Klasse()
genau bewirkt.

Dennoch: Dankeschön :)

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   phpwelt.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Impressum
© 1999-2024 Sebastian Wichmann - Flashhilfe.de