Vererbung im MVC möglich? [Flash 11]
| 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:
| | | 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. | | | 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... | | | 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. :) | | | 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. | | | 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:1 | cauto.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...
|
| | | 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 | |
| | 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 :) | |
| Ähnliche Beiträge zum Thema | |
|
Flashhilfe.de Flash Platform Tipps & Tutorials Flash Platform Andere Programmiersprachen Jobangebote Diskussionen
Flashhilfe News
Regeln & Bedingungen
|