kalde funktion i parent class fra instantieret class

Se fjordside's brugerprofil
Indmeldt: 24-04-2008
Indlæg: 28
Er offline

Hej Alle,

-Går lige til sagen:

Jeg har en mainclass hvor jeg instantierer en anden class - nu vil jeg så gerne, fra min instantierede class, kalde en funktion oppe i min mainclass - men hvordan gøres dette.

har prøvet movieClip(parent).somefunction() (og mange andre) uden held...

pft

Mvh

Jan Fjordside

Kommentarer

Se fjordside's brugerprofil
Indmeldt: 24-04-2008
Indlæg: 28
Er offline

Edit,

Fandt løsningen - jeg skulle første adde min class to stage (den extender movieclip)

Dog kunne det være fint hvis det ikke var nødvendigt at adde den til stage for at kalde funktioner i mainclass'en Shocked

Mvh

Jan Fjordside

Se jakobhs's brugerprofilcontributer
Indmeldt: 10-01-2007
Indlæg: 1125
Er offline

Grunden til at du ikke har held med 'parent' før du har added den til stagen er at den ikke har nogen parent før den er i en DisplayListe (added til stagen)

Mvh Jakob

..god weekend Smile

Flash, Flash & Photoshop.
16 år Århus

Se mat's brugerprofil
Indmeldt: 04-07-2009
Indlæg: 87
Er offline

Det er ikke særlig hensigtsmæssigt (eller eleganr) at "kravle" op igennem display hierakiet for at kalde funktioner (og det kræver, som du siger, at de er tilføjede til display listen).

En bedre måde at gøre det på er ved at give en reference til det objekt du ønsker at kalde en funktion på, f.eks;

Main.as;

package 
{
	import flash.display.Sprite;
	import flash.events.Event;
 
	public class Main extends Sprite 
	{
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			var t:Test = new Test(this);
		}
		public function someFunction( msg:String ):void {
			trace(msg);
		}	
	}
}

Test.as

package  
{
	public class Test 
	{
		private var _main:Main;
		public function Test( main:Main ) 
		{
			_main = main;
			_main.someFunction("hello main");
		}
	}
}

Ovenstående er ofte heller ikke specielt elegant (men det demonstrerer hvordan man kan give referencer til objekter). Den "rigtige" tilgang ville være at dit indeholdte objekt afsender en event når en tilstand ændres som dit "parent" objekt reagerer på. F.eks;

Main.as;

package 
{
	import flash.display.Sprite;
	import flash.events.Event;
 
	public class Main extends Sprite 
	{
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
			var t:Test = new Test();
			t.addEventListener(Test.ON_SOMETHING, someFunction);
			t.haveSomeEventOccur();
		}
		public function someFunction( event:Event ):void {
			trace("some event occured in t");
		}	
	}
}

Test.as;

package  
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	public class Test extends EventDispatcher
	{
		public static const ON_SOMETHING:String = "onSomething";
		public function Test() 
		{
		}
		public function haveSomeEventOccur():void {
			dispatchEvent( new Event(ON_SOMETHING) );
		}
	}
}

Den store forskel er at nu behøver Test objektet slet ikke vide noget om Main objektet, og Test objektet kan derfor eksistere i mange andre sammenhænge uden at være afhængig af en Main type.

(jeg ved godt at ovenstående eksempel er en smule kikset, men det illustrerer pointen...tror jeg)

Se fjordside's brugerprofil
Indmeldt: 24-04-2008
Indlæg: 28
Er offline

Tak begge to for jeres svar Very Happy

Især tak til Mat for de gode eksempler.... Shocked

Mvh

Jan Fjordside