Flashhilfe.de - Flash Community

Klasse ohne Konstruktor - Statische Klasse? [Flash 9]

 


AntwortenRegistrieren Seite1 2 3  

niquito12#1
Benutzerbild von niquito12
Beiträge: 901
Wohnort: Nether-Bavaria
Registriert: Jun 2008

13.11.2008, 10:41

Grüße Gemeinde!

Ich habe eine Klasse ohne Konstruktor gebaut. Es soll mir lediglich als Datenobjekt zur Verfügung stehen vergleichbar den Strukturen in C.

Ich habe irgendwo gelesen dass das dann hier eine Statische Klasse sein soll. Ich würde jedoch gerne hier Instanzen erstellen. Weiß jemand bescheid was sich dabei unterscheidet?

Hier mal ein Abriss von dem Code

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package
{
   public class DataSource
   {
      private var _name:String;      
      
      public function DataSource ():void
      {
         
      }
      
      public function get name():String { return _name; }
      
      public function set name(value:String):void
      {
         _name = value;
      }            
   }
}
Qt! www.adrianslaboratory.net
Geändert von niquito12 am 13.11.08 um 10:45 Uhr
Werbung
Beiträge: 0
Registriert: Feb 2016


rendner#2
Benutzerbild von rendner
Beiträge: 1016
Wohnort: derzeit München
Registriert: Jul 2004

13.11.2008, 10:47

Wenn du den Konstruktor weglässt, wird dieser vom Compiler selber generiert. Zumindest ist das in anderen Sprachen so.
Und du kannst "normale" Instanzen wie bei jeder Klasse auch erstellen, heißt also das diese nicht static sind.
rendner
Geändert von rendner am 13.11.08 um 10:47 Uhr
niquito12#3
Benutzerbild von niquito12
Beiträge: 901
Wohnort: Nether-Bavaria
Registriert: Jun 2008

Themenautor/in

13.11.2008, 10:59

Achso . Also sobald ich mit dem new Operator eines dieser Objekte erstelle kann ich es als "normale" Klasse verwenden, ich könnte aber auch genauso
ActionScript:
1DataSource().name = "bla"
aufrufen, wodurch der Flashplayer es als statische Klasse behandeln würde. Habe ich das richtig verstanden?
Ich bin gerade auf der Suche danach was statische Klassen gut macht und wann man sie verwenden sollte. Ich finde derzeit viel darüber, dass man damit Utils basteln kann. Den Umgang habe ich verstanden.

Danke rendner, hast mir sehr geholfen.

Nachtrag:

Mir gab das Flashdevelop nur Highlighting und Completition auf die Verwendung als Statische Klasse deswegen wurde ich überhaupt stutzig.
Qt! www.adrianslaboratory.net
Geändert von niquito12 am 13.11.08 um 11:03 Uhr
rendner#4
Benutzerbild von rendner
Beiträge: 1016
Wohnort: derzeit München
Registriert: Jul 2004

13.11.2008, 13:40

ActionScript:
1DataSource().name = "bla"

Damit erzeugst du doch einen neue Instanz die dann wiederum für den gc freigegeben wird weil keine Referenz mehr auf diese besteht.

Du musst dich schon entscheiden was du willst, entweder Instanzen der Klasse oder eine statische Klasse.
rendner
Geändert von rendner am 13.11.08 um 13:41 Uhr
Werbung
Beiträge: 0
Registriert: Feb 2016


omega psi#5
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

13.11.2008, 14:00

Was ist bitte eine statische Klasse in ActionScript? Es gibt statische Eigenschaften und Methoden, aber Klassen?
Architectures - Refactoring - Prototyping - Coding - Training
niquito12#6
Benutzerbild von niquito12
Beiträge: 901
Wohnort: Nether-Bavaria
Registriert: Jun 2008

Themenautor/in

13.11.2008, 14:27

Rendner ich glaube ich habe mich etwas missverständlich ausgedrückt. Ich wurde am Anfang von der Completition in Flashdevelop drauf gebracht , dass er den oben angegebenen Code als statische Klasse erkannte. Ich wußte nicht genau über statische Klassen bescheid, hatte es nur in der Tweener Dokumentation gelesen. (s. Code unten ) dass kein Konstruktor vorliegt.
Meine Frage vorher bezog sich auf die Möglichkeit DataSource als statische wie auch als Instanz zu verwenden. Es war eher eine allgemeine Wissensfrage, was wahrscheins nicht so rüberkam. Sorry (:


Meine Quintessenz:

ActionScript:
1DataSource().name = "bla"

Diese Funktion führt also den Setter aus und dann verschwindet das Objekt wieder.

In der Klasse können Methoden aufgerufen werden und wenn diese abgearbeitet sind der Speicher für diese Klasse wieder freigegeben wird. Jetzt verstehe ich auch den Vorteil solcher Klassen.



@ ωψ Den Begriff habe ich hierher (siehe Code unten - aus der Tweenerklasse). Es gibt wohl kein Schlüsselwort an sich dafür.

ActionScript:
1
2
3
public function Tweener () {
         trace ("Tweener is a static class and should not be instantiated.");
      }
Qt! www.adrianslaboratory.net
omega psi#7
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

13.11.2008, 14:36

Naja, ohne hier jemanden zu nahe treten zu wollen. Es gibt keine statischen Klassen in ActionScript. Man kann jede Klasse in ActionScript instanziieren... sofern nicht durch den trace - sinniger wäre ein Error - die Instanziieren unterbunden wird... in dem Fall ist es gar nur eine Bitte.
Architectures - Refactoring - Prototyping - Coding - Training
niquito12#8
Benutzerbild von niquito12
Beiträge: 901
Wohnort: Nether-Bavaria
Registriert: Jun 2008

Themenautor/in

13.11.2008, 15:24

Ich bin in diesem Thema nicht sehr sicher wie man merkt.

Ich bin bei einer kleinen Internetrecherche schon oft auf das Wort static class gestoßen und verstand es so wie in der Tweener Doc erklärt. Dein Einwand leuchet natürlich ein und ich hab es nach ein paar Tests gerade auch geprüft dass es wirklich nicht geht. Wie ermögliche ich die Benutzung als "statische Klasse" die bei Tweener nur über die Empfehlung im Sourcecode eine ist, also diese Benutzung ,
ActionScript:
1test:Rückgabetyp = Klassenname.methode();

ohne dass folgende Fehlermeldung kommt?         

1061: Aufruf für eine möglicherweise nicht definierte Methode methode über einen Verweis mit statischem Typ Class.
Qt! www.adrianslaboratory.net
omega psi#9
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

13.11.2008, 15:36

Schreibe statische Methoden. Wenn du keine Instanzvariablen, respektive -Methoden implementierst, ist alles gut. Im Konstruktor kannst du dann sowas wie
ActionScript:
1throw new Error("Instanciating" + getQualifiedClassName(this) + "is not allowed.");
Ist zwar ein Fehler, aber so merken die Leute, was du von Ihnen willst. Autocompletion und Dokumentation tun ihr letztes.
Architectures - Refactoring - Prototyping - Coding - Training
niquito12#10
Benutzerbild von niquito12
Beiträge: 901
Wohnort: Nether-Bavaria
Registriert: Jun 2008

Themenautor/in

13.11.2008, 15:41

Verstehe, also Klassenvariablen als static var definieren , Methoden sowieso dann klappts auch mit der Static Class. So , wieder was gelernt. Sofort mal ausprobieren.

Edit: Und schließlich hats Klick gemacht. Danke für die Erklärungen!!
Qt! www.adrianslaboratory.net
Geändert von niquito12 am 13.11.08 um 15:52 Uhr
niquito12#11
Benutzerbild von niquito12
Beiträge: 901
Wohnort: Nether-Bavaria
Registriert: Jun 2008

Themenautor/in

13.11.2008, 15:54

Statische Klasse

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package
{
   import flash.utils.getQualifiedClassName;
   public class Data
   {
      private static  var _name:String;

      public function Data ():void
      {
         throw new Error("Instanciating" + getQualifiedClassName(this) + "is not allowed. Static Class");
      }
      public static function foo ():String
      {
         trace ("foo");
         _name = "foo2";
         return name;
      }
      public static function get name ():String
      {
         return _name;
      }
      public static function set name (value:String):void
      {
         _name = value;
      }
   }
}


Und hier ein Beispielaufruf:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package
{
   import flash.display.Sprite;
   import Data;
   public class Main extends Sprite
   {
      private var _name:String;

      public function Main ():void
      {
         trace (Data.foo());
      }      
   }
}
Qt! www.adrianslaboratory.net
qlistenerp#12
Benutzerbild von qlistenerp
Beiträge: 70
Wohnort: Ba.-Wü.
Registriert: Oct 2006

13.11.2008, 16:03

Ich rate jetzt mal ins Blaue und denke mir, dass du allen Klassen den gleichen Zugang zu einer bestimmten Datenquelle bereitstellen möchtest.
Mir würde da spontan das Singelton-Pattern einfallen: Wiki.
Dieses Pattern sagt aus, dass eine Klasse keinen öffentlichen Konstuktor hat, sondern eine statische Methode zur Verfügung stellt, die eine Instanz der Klasse zurückliefert.
ActionScript:
1
2
3
4
5
6
7
8
public class Singleton {
      private static instance:Singleton = new Singleton();
      private function Singleton():void{};
      public static getInstance():Singleton{
          return instance;
      }
      // Dein Code hier
}


Ich habe lange nichts mehr mit Actionscript gemacht, deswegen sieht das ganze etwas JAVA-like aus.
Die Methode getInstance gibt dir immer eine Referenz auf das gleiche Objekt zurück, nämlich instance.
So kannst du sichergehen überall das gleiche Objekt dieser Klasse zu nutzen.
Falls das nicht deine Intention war, dann siehe das ganze als nützliche Ergänzung an ;).

Gruß

Edit:
Okay, nach deinem letzten Post sehe ich, dass nur statische Methoden zur Verfügung gestellt werden sollen.
Was wäre denn so fatal, wenn du ein Objekt deiner Klasse erstellst ?
Wie ich gerade gelesen habe, unterstützt AS3 keine abstract Klassen, was genau dein Ding gewesen wäre ;).
Geändert von qlistenerp am 13.11.08 um 16:10 Uhr
niquito12#13
Benutzerbild von niquito12
Beiträge: 901
Wohnort: Nether-Bavaria
Registriert: Jun 2008

Themenautor/in

13.11.2008, 16:15

Es war zwar nicht meine Intention, aber allemal sehr nützlich, werde das demnächst sicher wieder benötigen. Kannte das noch aus C#.

Frage beantwortet [x]
Schlauer geworden [x]

Danke ;)
Qt! www.adrianslaboratory.net
omega psi#14
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

13.11.2008, 16:19

1. SingletonPattern ist böse
2. private Konstruktoren gibt es nicht in ActionScript 3
3. ob man abstrakte Klassen so einsetzen sollte?

Just my 2cents...
Architectures - Refactoring - Prototyping - Coding - Training
badskill#15
Benutzerbild von badskillFlashhilfe.de Moderator
Beiträge: 5285
Wohnort: Bernau (bei Berlin)
Registriert: Nov 2002

13.11.2008, 16:34

Singleton ist böse?
So böse kann es doch nicht sein. Sieht man ja relativ häufig. Bin neulich wieder darüber gestolpert als ich was mit Cairngorm aufgesetzt habe.
Mir fällt jetzt spontan auch nichts ein, was dagegen spricht. Ein zentraler Zugriff auf bestimmte Daten ist oft sehr bequem.
omega psi#16
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

13.11.2008, 16:42

Ja, Singletons nehmen aber Transparenz aus der Architektur/Struktur und Komponenten die einen Singletons verwenden um Zugriff auf die Daten zu bekommen sind so wiederverwendbar wie alte Reifen. Singletons werden zu oft als globale Variablen verwendet -> deswegen sind sie böse und gelten als Antipattern...

Nur weil man Dinge häufig sieht, sind sie deswegen nicht gut.
Architectures - Refactoring - Prototyping - Coding - Training

AntwortenRegistrieren Seite1 2 3  

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   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2020 Sebastian Wichmann - Flashhilfe.de