Flashhilfe.de - Flash Community

Vererbung im MVC möglich? [Flash 11]

Forum > ActionScript 3.0 > Vererbung im MVC möglich?

 


AntwortenRegistrieren Seite1  

 14.02.2012, 23:59 
Benutzerbild von Rotblitz
Beiträge: 45
Wohnort: Hamburg
Registriert: May 2009

Vererbung im MVC möglich?
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
 15.02.2012, 14:20Re1
Benutzerbild von valuee
Beiträge: 129
Wohnort: Straight Outta Berlin-City
Registriert: Aug 2006

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.
 15.02.2012, 14:49Re2
Benutzerbild von valuee
Beiträge: 129
Wohnort: Straight Outta Berlin-City
Registriert: Aug 2006

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...
 
nicht sichtbar bei eingeloggten Mitgliedern
 15.02.2012, 17:26Re3
Benutzerbild von Rotblitz
Beiträge: 45
Wohnort: Hamburg
Registriert: May 2009

Themenautor/in

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. :)
 15.02.2012, 17:48Re4
Benutzerbild von valuee
Beiträge: 129
Wohnort: Straight Outta Berlin-City
Registriert: Aug 2006

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

Themenautor/in

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...
 
nicht sichtbar bei eingeloggten Mitgliedern1&1 Webhosting
 16.02.2012, 10:12Re6
Benutzerbild von valuee
Beiträge: 129
Wohnort: Straight Outta Berlin-City
Registriert: Aug 2006

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

 22.02.2012, 21:38Re7
Benutzerbild von Rotblitz
Beiträge: 45
Wohnort: Hamburg
Registriert: May 2009

Themenautor/in

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 :)
 
Themen
Ähnliche Beiträge zum Thema
 

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.
Partner Webseiten: DesignerInAction.de   Designnation.de   Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   PSD-Tutorials.de   Tutorials.de

Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2012 Sebastian Wichmann - Flashhilfe.de