Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 18-02-2006, 16:08   #1 (permalink)
\x3a\x6f\x29
 
Benutzerbild von [je]
 
Registriert seit: Apr 2004
Ort: paris
Beiträge: 806
Namespaces

Lasst uns mal ein bisschen zusammentragen. Bisher habe ich Probleme die Namespaces sinnvoll einzusetzen.

Ich würde gerne wissen, wie ihr das hinbekommt. Z.b. könnte ich mir vor mein BitmapData neu zu definieren.

var x: BitmapData = new ImageProcessing::BitmapData();

Oder so ähnlich. Bisher kriege ich aber einen ganz dämlichen Fehler.

Code:
package ip.img
{	
	namespace ImageProcessing;
	
	public class Image
	{	
		public function Image()
		{
		}
	}
}
//fehler: file found in an actionscript-classpath can not have more than one externally visible definition. ip.img:ImageProcessing;ip.img:Image
So schnell schon falsch?

Wieso geht auch das nicht:
Code:
package ip.img
{		
	public class Image
	{	
		public function Image()
		{
		}
	}
	
	public class B
	{
	}
}
//fehler: A file found in an actionscript-classpath can not have more than one externally visible definition. ip.img:Image;ip.img:B
Wieso also geht es nicht? Kann man überhaupt Klassen innerhalb eines Namespace definieren?

Wenn ja, wie?

Und: Wieso kann ich in einer *.as Datei nicht zwei sichtbare Klassen haben? Das macht mich grade stuzig.
__________________
joa ebert
http://blog.joa-ebert.com/ - http://www.joa-ebert.com/
[je] ist offline   Mit Zitat antworten
Alt 18-02-2006, 16:39   #2 (permalink)
\x3a\x6f\x29
 
Benutzerbild von [je]
 
Registriert seit: Apr 2004
Ort: paris
Beiträge: 806
Beim teste grade, sehr confusing.

Code:
		namespace RGBMath;
		namespace BinMath;
		
		RGBMath function distance(a: int, b: int): int
		{
			return a-b;
		}
		
		BinMath function distance(a: int, b: int): int
		{
			return a*b;
		}
Das innerhalb einer Klasse. Ich bekomme die warnung das beide namespaces ins scope internal gelegt werden, ich kann aber über RGBMath::distance() und BinMath::distance() beide Funktionen gesondert ansprechen..?!
__________________
joa ebert
http://blog.joa-ebert.com/ - http://www.joa-ebert.com/
[je] ist offline   Mit Zitat antworten
Alt 18-02-2006, 17:20   #3 (permalink)
\x3a\x6f\x29
 
Benutzerbild von [je]
 
Registriert seit: Apr 2004
Ort: paris
Beiträge: 806
Bisher scheinen mir Namespaces wenig nützlich,
wenn ich nicht einmal eine Klasse in einem Namespace deklarieren kann?

Theoretisch ist jetzt so etwas möglich wie, bei einer Vektor-Klasse, dass man eine Klasse hat, die 2D und 3D ermöglicht. So könnte(!) man überladen.

Beispiel:
Code:
	public class VectorMath
	{
		namespace Math2D;
		namespace Math3D;
		
		Math3D static function distance( a: Vector3D, b: Vector3D ): Number
		{
			return ...
		}
		
		Math2D static function distance( a: Vector2D, b: Vector2D ): Number
		{
			return ...
		}
	}
Dann wäre so etwas möglich wie

VectorMath.Math3D::distance( a, b );
VectorMath.Math2D::distance( c, d );

Bisher alles nicht so wirklich das, was ich von Namespaces kenne :o)
__________________
joa ebert
http://blog.joa-ebert.com/ - http://www.joa-ebert.com/
[je] ist offline   Mit Zitat antworten
Alt 19-02-2006, 09:41   #4 (permalink)
\x3a\x6f\x29
 
Benutzerbild von [je]
 
Registriert seit: Apr 2004
Ort: paris
Beiträge: 806
so wie ich es jetzt durchblicke funktioniert ein namespace bisher nur innerhalb einer klasse. somit ist auch das vektor-beispiel quark, denn es funktioniert nur in der selben klasse.

use ist übrigens auch noch nicht implementiert, von daher ist das alles nicht so spaßig. schade :o(
__________________
joa ebert
http://blog.joa-ebert.com/ - http://www.joa-ebert.com/
[je] ist offline   Mit Zitat antworten
Alt 19-02-2006, 11:08   #5 (permalink)
[+]
 
Benutzerbild von André Michelle
 
Registriert seit: Dec 2002
Ort: cologne
Beiträge: 2.271
Hast du auch ein Beispiel, was funktioniert ?

Wahrscheinlich sind diese Namespaces eher für Applikation gedacht und nicht für die Engineentwicklung (schnelle Views) geeignet. Sympathisch finde ich diese Doppelpunktschreibweise eh nicht.
__________________
aM

blog | laboratory | tonfall | processing

Audiotool.com
André Michelle ist offline   Mit Zitat antworten
Alt 19-02-2006, 13:29   #6 (permalink)
\x3a\x6f\x29
 
Benutzerbild von [je]
 
Registriert seit: Apr 2004
Ort: paris
Beiträge: 806
Code:
import flash.util.trace;

	public class VectorMath
	{
		namespace Math2D;
		namespace Math3D;
		
static public function test(): void {
trace( 'VectorMath.test' );
Math2D::distance(0,0);
Math3D::distance(0,0);
}
		Math2D static function distance( a: int, b: int ): Number
		{
trace( 'Math2D::distance' );
			return 0;
		}
		
		Math3D static function distance( a: int, b: int ): Number
		{
trace( 'Math3D::distance' );
			return 0;
		}
	}
Dann VectorMath.test(); irgendwo. Das funktioniert so, aber nur innerhalb der Klasse mit den Namespaces.

André: Benutzt du Miranda? Weil dann solltest du mal updaten :o)
__________________
joa ebert
http://blog.joa-ebert.com/ - http://www.joa-ebert.com/
[je] ist offline   Mit Zitat antworten
Alt 20-02-2006, 09:46   #7 (permalink)
www.kruesch.de
 
Benutzerbild von flory
 
Registriert seit: Feb 2002
Beiträge: 1.057
Das neue Namespace Konzept ist wirklich etwas verwirrend.
Grundsätzlich gibt es eine Unterscheidung zwischen Packages, das ist die Art von Namespaces,
die man im Zusammenhang mit OOP normalerweise kennt - und das Namespace
Konzept das mit
E4X eingeführt wurde. Das ist das Namespace Konzept von XML, wo einem Element Attribute
aus verschiedenen XML-Namensräumen hinzugefügt werden können.
Namespaces machen also hauptsächlich dann Sinn, wenn Du mit XML hantierst.

Vielleicht klärt das ein paar Deiner Fragen.

Gruss
Florian
__________________
www.planet-xaml.net
flory ist offline   Mit Zitat antworten
Alt 20-02-2006, 10:16   #8 (permalink)
Nagelneuer User
 
Benutzerbild von hazy fantazy
 
Registriert seit: Dec 2005
Beiträge: 924
Ich habe irgendwo mal gelesen, dass private und public auch über Namespaces realisiert sind. Ich habe mir das noch nicht näher angeschaut, ist das überhaupt möglich? Mit den doppelten Doppelpunkten wohl kaum.
__________________
The fact that you've got "Replica" written on the side of your gun and the fact that I've got "Desert Eagle written on the side of mine ... :D
hazy fantazy ist offline   Mit Zitat antworten
Alt 20-02-2006, 11:17   #9 (permalink)
0x2b | ~0x2b;
 
Benutzerbild von bort
 
Registriert seit: Jan 2003
Ort: Rocky Beach
Beiträge: 370
Nicht nur das. Namespaces verhindern auch die Kollision von Variablen/Methoden mit gleichem Namen. Die flash.util.Proxy Klasse benutzt dafür z.B. den Namespace flash_proxy. Anstelle von :: kann man auch ein use benutzen, um einen Namespace auszuwählen.

Neben der Zugriffskontrolle lässt sich über Namespaces aber auch Verhalten implementieren. Hier ein Beispiel aus der Doku, das Namespaces zur Unterscheidung der zu verwendenen Füllfarbe bei einem Rollover benutzt:
ActionScript:
  1. package {
  2.     import flash.display.Sprite;
  3.  
  4.     public class NamespaceExample extends Sprite {     
  5.         public function NamespaceExample() {
  6.             addChild(new StateButton("Press Me."));
  7.         }
  8.     }
  9. }
  10.  
  11. import flash.display.Sprite;
  12. import flash.display.TextField;
  13. import flash.events.Event;
  14. import flash.events.MouseEvent;
  15.  
  16. class StateButton extends Sprite{
  17.     private namespace out;
  18.     private namespace over;
  19.     private namespace down;
  20.     private var label:TextField;
  21.     private var labelTxt:String;
  22.     private var ns:Namespace;
  23.     out var bgColor:Number = 0xFF0000;
  24.     over var bgColor:Number = 0xFFFF00;
  25.     down var bgColor:Number = 0xFFFFFF;
  26.      
  27.     public function StateButton(str:String) {
  28.         buttonMode = true;
  29.         labelTxt = str;
  30.         ns = out;
  31.         draw();
  32.         addLabel();
  33.         addListeners();
  34.     }
  35.  
  36.     private function addLabel():void {
  37.         label = new TextField();
  38.         label.text = labelTxt;
  39.         label.width = 50;
  40.         label.height = 20;
  41.         label.mouseEnabled = false;
  42.         addChild(label);
  43.     }
  44.      
  45.     private function addListeners():void {
  46.         addEventListener(MouseEvent.MOUSE_UP, mouseOverHandler);
  47.         addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler);
  48.         addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
  49.         addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
  50.     }
  51.  
  52.     private function mouseOutHandler(e:Event):void {
  53.         ns = out;
  54.         draw();
  55.     }
  56.  
  57.     private function mouseOverHandler(e:Event):void {
  58.         ns = over;
  59.         draw();
  60.     }
  61.  
  62.     private function mouseDownHandler(e:Event):void {
  63.         ns = down;
  64.         draw();
  65.     }
  66.  
  67.     private function draw():void {
  68.         this.graphics.clear();
  69.         this.graphics.beginFill(ns::bgColor);
  70.         this.graphics.drawRect(0, 0, 120, 80);
  71.     }
  72. }

Gruß,
bort.
__________________
http://www.flexperten.de
bort ist offline   Mit Zitat antworten
Alt 20-02-2006, 11:29   #10 (permalink)
\x3a\x6f\x29
 
Benutzerbild von [je]
 
Registriert seit: Apr 2004
Ort: paris
Beiträge: 806
Danke für die Antworten.
Damit klärt sich einiges. Die implementierung der Namespaces habe ich wohl auch falsch gesehen.

Eine Math-Klasse für Vektoren wäre somit immernoch möglich, wenn ich vorher immer das Namespace umstelle. Dann würde die add() Funktion 2D Vektoren addieren oder so. Interessant

Das Button Beispiel finde ich von MM schlecht gewählt. Da würde ich glaube ich einfach den Namen der Variablen mit einem Suffix wie Over, Out und Pressed versehen.

Bort: Unter welchem Link hast du das in der Doku gefunden? Habe auch mal gesucht, aber nicht viel gefunden.
__________________
joa ebert
http://blog.joa-ebert.com/ - http://www.joa-ebert.com/
[je] ist offline   Mit Zitat antworten
Alt 20-02-2006, 11:41   #11 (permalink)
0x2b | ~0x2b;
 
Benutzerbild von bort
 
Registriert seit: Jan 2003
Ort: Rocky Beach
Beiträge: 370
In der API Doku: Top Level --> Namespace
http://livedocs.macromedia.com/labs/...Namespace.html

Gruß,
bort.
__________________
http://www.flexperten.de
bort ist offline   Mit Zitat antworten
Alt 20-02-2006, 12:08   #12 (permalink)
flachzange
 
Benutzerbild von elias
 
Registriert seit: Jun 2003
Ort: berlin
Beiträge: 3.932
Die Namespaces für XML sind wohl notwendig und auch OK. Aber das Konzept
auf Klassen umzuwälzen finde ich ein wenig obskur. Mir fällt zumindest nichts ein
was ich nicht auch mit herkömmlichen Features realisieren könnte. Außerdem
verleitet es stark dazu alles in einer Klasse zu definieren.
Ich kann mir aber vorstellen das die Namespaces einen kleinen Performanceschub geben.
__________________
elias ist offline   Mit Zitat antworten
Alt 20-02-2006, 12:13   #13 (permalink)
\x3a\x6f\x29
 
Benutzerbild von [je]
 
Registriert seit: Apr 2004
Ort: paris
Beiträge: 806
bort: Das ist ja die Dokumentation zur Namespace Klasse. Ich dachte jetzt eher an etwas wie zum arbeiten mit den Namespaces.

Es gibt ja auch irgendwo etwas über private, protected und public. Und eben das auch über Namespaces. Nur habe ich es nicht gefunden bisher.

Elias: Namespaces sind doch toll. Aber, ich kann verstehen wenn man die für unnütz empfindet, denn eigentlich sind die Packages schon ein Ersatz (in Flash, in C++ nicht).
__________________
joa ebert
http://blog.joa-ebert.com/ - http://www.joa-ebert.com/
[je] ist offline   Mit Zitat antworten
Alt 20-02-2006, 12:50   #14 (permalink)
www.kruesch.de
 
Benutzerbild von flory
 
Registriert seit: Feb 2002
Beiträge: 1.057
Ich kann mir vorstellen, dass man das vielleicht für UI Programmierung einsetzen kann,
um so was ähnliches wie Dependency Properties in XAML zu erreichen.
Oder, wenn man die Sichtbarkeit von Methoden/Eigentschaften im Zusammenspiel von Klassen
feiner regeln will als über private/protected/public.
Das Beispiel aus der Doku finde ich aber total daneben...

Florian
__________________
www.planet-xaml.net
flory ist offline   Mit Zitat antworten
Alt 20-02-2006, 16:04   #15 (permalink)
0x2b | ~0x2b;
 
Benutzerbild von bort
 
Registriert seit: Jan 2003
Ort: Rocky Beach
Beiträge: 370
Ok, hier ein Beispiel mit einem privaten Namespace, der nur von Klassen aufgerufen werden kann, die ein bestimmtes Interface implementieren. In der Klasse SecuredNameSpace ist ein privater Namespace deklariert. Die Funktion getHiddenNamespace prüft, ob das übergebene Objekt vom Typ ISecure ist. Wenn ja, dann wird der private Namespace zurückgegeben.

Code:
// Main.as
package {

	import flash.display.Sprite;
	import flash.util.trace;

	public class Main extends Sprite 
	{ 
		public function Main() 
		{
			try 
			{
				var testA:NameSpaceTestA = new NameSpaceTestA();
				trace(testA.tryToGetText());
				
				var testB:NameSpaceTestB = new NameSpaceTestB();
				trace(testB.tryToGetText());
			} 
			catch (e:Error)
			{
				trace("Error: " + e.message);
			}
		}
	}
}

interface ISecure 
{
}

class SecuredNameSpace
{
    private namespace hidden_namespace;
   
    public function getHiddenNamespace (obj:Object):Namespace 
    {
    	return (obj is ISecure)? hidden_namespace : null;
    }
   
    hidden_namespace function getText():String 
    {
		return "Hidden Text";
    }

}
       
class NameSpaceTestA implements ISecure 
{
	public function tryToGetText():String 
	{
	    var securedNameSpace:SecuredNameSpace = new SecuredNameSpace();
	    var ns:Namespace = securedNameSpace.getHiddenNamespace (this);
	    return securedNameSpace.ns::getText();
	}
}
       
class NameSpaceTestB 
{
	public function tryToGetText():String 
	{
	    var securedNameSpace:SecuredNameSpace = new SecuredNameSpace();
	    var ns:Namespace = securedNameSpace.getHiddenNamespace (this);
	    return securedNameSpace.ns::getText();
	}
}
Gruß,
bort.
__________________
http://www.flexperten.de

Geändert von bort (20-02-2006 um 16:23 Uhr)
bort 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 12:04 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele