Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 09-08-2008, 08:00   #1 (permalink)
T-Noblesse
 
Benutzerbild von sobo
 
Registriert seit: Jun 2006
Ort: München
Beiträge: 307
MVC, Interfaces und abstrakte Klassen

Hallo,

ich schlage mich gerade mit pattern herum und es tun sich ein paar Fragen auf.
Konkret beim MVC:
Bei einigen Beispielen im Web (und auch in Moock's essential AS2) werden die Model-, View-, und Controller-Klassen jeweils von abstrakte Klassen abgeleitet. Diese abstrakten Klassen implementieren jeweils wieder ein Interface.
Der Sinn eines Interfaces liegt doch darin, dass Klassen, die dieses Interface implementieren gezwungen werden, die entsprechenden Funktionen zu beinhalten. Durch eine abstrakte Klasse "zwischen" Interface und der von der abstraken Klasse abgeleiteten Klasse geht doch diese Sicherheit verloren? Ich bin ja nicht gezwungen, die entsprechenden Methoden der Mutterklasse zu überschreiben?
Wo liegt da der Sinn?

Zweite Frage:
Ist es besser (performanter?), die View beim Model als Event-Listener zu registrieren, oder wie in AS2 die update-Methode direkt vom Model aus aufzurufen?

Danke und Gruß,
sobo
__________________
Milchreis schmeckt dann am besten, wenn man ihn kurz vor dem Verzehr durch ein saftiges Steak ersetzt.
sobo ist offline   Mit Zitat antworten
Alt 09-08-2008, 08:10   #2 (permalink)
Flashworker
 
Benutzerbild von sebastian
 
Registriert seit: Nov 2001
Ort: Wiesbaden
Beiträge: 10.935
Hi,
also in der Tat hast du in AS das Problem, dass es keine richtig
abstrakten Klassen und Methoden gibt. In AS3 schreibt man dann
meistens einen Runtime Fehler rein um das Überschreiben zu
erzwingen.

Aber konkret zu MVC bei Moocks AS2 Buch: Ist vom Grundprinzip zwar
sicher ganz okay, aber auch nicht das Musterbeispiel schlechthin. Schau
dir vielleicht noch ein paar andere an.

Und es ist in jedem Fall besser, wenn die Views sich beim Model anmelden.
Alleine schon weil das Model die Views nicht zu kennen hat und du deine
Applikation problemlos um Views erweitern kannst ohne ans Model ran
zu müssen.

gruß

Geändert von sebastian (09-08-2008 um 09:02 Uhr)
sebastian ist offline   Mit Zitat antworten
Alt 09-08-2008, 08:30   #3 (permalink)
T-Noblesse
 
Benutzerbild von sobo
 
Registriert seit: Jun 2006
Ort: München
Beiträge: 307
Alles klar, vielen Dank!
sobo
__________________
Milchreis schmeckt dann am besten, wenn man ihn kurz vor dem Verzehr durch ein saftiges Steak ersetzt.
sobo ist offline   Mit Zitat antworten
Alt 09-08-2008, 13:45   #4 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg
Beiträge: 4.386
Was ich seit kurzem als "Ersatz" für abstrakte Klassen verwende ist eine Hirarchie von Interfaces:
Angenommen, ich hab ein Interface IInterface mit einigen Methoden, von denen einige schon in einer abstrakten Klasse implementiert werden können, dann teile ich das Interface auf in IInterfaceBase (mit den Methoden für die "abstrakte" Klasse und IInterface mit dem Rest.
Die Vererbungsstruktur sieht dann letzten Endes so aus:
PHP-Code:
interface IInterface extends IInterfaceBase
class MyAbstractClass implements IInterfaceBase
class MyConcreteClass extends MyAbstractClass implements IInterface 
Damit kann ich Methoden in MyAbstractClass vorgeben, soweit sinnvoll, ohne dass ich Runtimeexceptions für leere Methoden einführen muss, da ich diese einfach in das Interface IInterface schreiben kann.
Einziger Nachteil ist, wenn ich in den implementierten Methoden in der "abstrakten" Klasse Methoden aus IInterface aufrufen möchte, dann muss ich this nach IInterface upcasten.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 09-08-2008, 14:45   #5 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Bremen
Beiträge: 13.278
So verfahre ich auch.
Omega Psi ist offline   Mit Zitat antworten
Alt 09-08-2008, 19:05   #6 (permalink)
T-Noblesse
 
Benutzerbild von sobo
 
Registriert seit: Jun 2006
Ort: München
Beiträge: 307
Ok, danke für den input!
__________________
Milchreis schmeckt dann am besten, wenn man ihn kurz vor dem Verzehr durch ein saftiges Steak ersetzt.
sobo ist offline   Mit Zitat antworten
Alt 05-11-2012, 12:55   #7 (permalink)
Neuer User
 
Registriert seit: Mar 2007
Beiträge: 326
Zitat:
Zitat von Janoscharlipp Beitrag anzeigen
Einziger Nachteil ist, wenn ich in den implementierten Methoden in der "abstrakten" Klasse Methoden aus IInterface aufrufen möchte, dann muss ich this nach IInterface upcasten.
was ist damit gemeint?
wie kann sowas aussehen?
able ist offline   Mit Zitat antworten
Alt 05-11-2012, 14:31   #8 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Bremen
Beiträge: 13.278
Man möchte so wenig konkret wie möglich arbeiten. Das heisst, in Janosch's Beispiel möchte man weitestgehend nach IInterfaceBase typisieren. Jede Methode, die in IInterfaceBase definiert ist, ist über diese Typisierung aufrufbar. Aber jede andere Methode, die nicht über durch den Typ IInterface definiert ist, kann nur durch einen Typecast(/Upcast im Kontext), aufgerufen werden.
Code:
package net.icodeapps.example.types {
  public interface IInterfaceBase {
    function get guid():String;
  }
}
Code:
package net.icodeapps.example.types {
  public interface IInterface extends IInterfaceBase {
    function get name():String;
  }
}
Code:
package net.icodeapps.example.types {
  public interface MyAbstractClass implements IInterfaceBase {
    private const _guid:String = Method.random().toString();
    public function get guid():String {
      return _guid;
    }
    public function get name():String {
      throw new IllegalOperationError('Invalid call.');
    }
  }
}
Code:
package net.icodeapps.example.types {
  public interface MyConcreteClass extends MyAbstractClass implements IInterface {
    override public function get name():String {
      return guid + "::OmegaPsi";
    }
  }
}
Code:
var i1:IInterfaceBase = new MyConcreteClass();
trace(i1.guid);
// trace(i1.name); // TypeError - die Methode ist nicht definiert für IInterface
const i2:IInterface = i1 as IInterface;
if (i2) {
  trace(i2.name);
}
Omega Psi ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 10:26 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2014 Marc Thiele