2011-09-01 3 views
1

다른 클래스에 매개 변수로 전달 된 클래스 참조를 인스턴스화하지 못했습니다. 이 예에서 ActionScript - 필수 매개 변수를 포함하는 클래스 참조 전달 및 인스턴스화?

3 개 종류가있다 : MainClass, 캔버스, 내가 MyCircle의 인스턴스를 생성하기 위해 원하는만큼 MyCircle의 클래스 참조를 전달 제가 캔버스의 인스턴스를 생성하고있는 MainClass에서 MyCircle

캔버스 내에서. 그러나 MyCircle 생성자에는 Canvas 내에서 만들어지는 필수 매개 변수가 포함되어 있습니다.

필수 매개 변수를 사용하여 클래스 참조를 전달하고 인스턴스화하는 방법은 무엇입니까?

MyCircle :

package 
{ 
    //Imports 
    import flash.display.Shape; 

    //Class 
    public class MyCircle extends Shape 
    { 
     //Constructor 
     public function MyCircle(color:uint, radius:uint) 
     { 
      graphics.beginFill(color, 1.0); 
      graphics.drawCircle(0, 0, radius); 
      graphics.endFill(); 
     } 
    } 
} 

캔버스 :

package 
{ 
    //Imports 
    import flash.display.DisplayObject; 
    import flash.display.Sprite; 
    import flash.utils.getDefinitionByName; 

    //Class 
    public class Canvas extends Sprite 
    { 
     //Constructor 
     public function Canvas(circleClassReference:String, amount:uint) 
     { 
      var CircleReference:Class = getDefinitionByName(circleClassReference) as Class; 

      for (var i:uint = 0; i < amount; i++) 
      { 
       var randomColor:uint = Math.random() * 0xFFFFFF; 
       var randomRadius:uint = Math.random() * 100 + 50; 

       var circleInstance:DisplayObject = new CircleReference(randomColor, randomRadius); 
       circleInstance.y = i * randomRadius; 

       addChild(circleInstance); 
      } 
     } 
    } 
} 

MainClass :

package 
{ 
    //Imports 
    import flash.display.Sprite; 

    //Class 
    public class MainClass extends Sprite 
    { 
     //Constructor 
     public function MainClass() 
     { 
      var myCanvas:Canvas = new Canvas("MyCircle", 10); 
      addChild(myCanvas) 
     } 
    } 
} 

,617,

[편집]


대신 클래스의 이름의 실제 클래스를 전달 아래 나와있는 더러운 수정의 필요성을 피할 것으로 보인다.

MainClass 생성자

public function MainClass() 
{ 
    var myCanvas:Canvas = new Canvas(MyCircle, 10); 
    addChild(myCanvas) 
} 

캔버스 생성자

public function Canvas(circleClassReference:Class, amount:uint) 
{ 
    var CircleReference:Class = circleClassReference; 

    for (var i:uint = 0; i < amount; i++) 
    { 
     var randomColor:uint = Math.random() * 0xFFFFFF; 
     var randomRadius:uint = Math.random() * 100 + 50; 

     var circleInstance:DisplayObject = new CircleReference(randomColor, randomRadius); 
     circleInstance.y = i * randomRadius; 

     addChild(circleInstance); 
    } 
} 
+0

어디서나 서클 클래스를 실제로 가져 옵니까? ? 내가 아는 한 제대로하고있다. 그러나 컴파일 타임에 코드가 MyCircle 클래스를 가져올 수있는 방법을 알지 못한다. 어떤 오류가 발생하고 있습니까? – shanethehat

+0

이 예제에서는 모든 3 개의 클래스가 동일한 패키지 디렉토리에 있으므로 가져올 필요가 없습니다. 나는이 클래스의 Canvas 클래스에 오류를 던집니다 :'CircleReference : Class = getDefinitionByName (circleClassReference) as Class; – TheDarkIn1978

+0

'MyCircle '을 참조하지 않으면'ReferenceError : Error # 1065 : Variable MyCircle is not defined. '당신의 코드 어디서나, 클래스는 컴파일러에 의해 포함되지 않을 것이다. MainClass 클래스 멤버에'private static var dummy : MyCircle'과 같은 것을 추가하고 다시 시도하십시오. – bummzack

답변

3

가져 오기 (또는 같은 패키지에있는) 컴파일러를 할 수있을 정도로 충분한되지는 응용 프로그램에서 클래스 정의를 포함 도메인. . 당신은 실제로 당신이 어딘가에 원하는, 또는 당신이로드 SWF의 정의를 포함하는 클래스를 사용해야합니다하지만 이것은 당신의 오류를 수정해야합니다

package 
{ 
    //Imports 
    import flash.display.Sprite; 

    //Class 
    public class MainClass extends Sprite 
    { 
     //Constructor 
     public function MainClass() 
     { 
      //unused variable definition for class embedding purposes 
      var tempCircle:MyCircle; 
      var myCanvas:Canvas = new Canvas("MyCircle", 10); 
      addChild(myCanvas) 
     } 
    } 
} 

을이 나중에 정의되지 않은 것을 MyCircle을 방지 할 수 있지만, 나는 꽤나 중요한 프로젝트에서 그것을 가지고 있음에도 불구하고 항상 더러운 수정으로 생각했습니다. 별도의 SWF에 정의를 임베드하는 것 외에는 더 나은 솔루션을 알고 싶습니다.

+0

여기에 클래스 이름 대신 실제 클래스를 전달하여 한 돌로 두 마리의 새를 죽일 수 있습니까? IE :'public function Canvas (circleClassReference : Class, amount : uint)'? – TheDarkIn1978

+0

이것이 API 인 경우 사용자가 클래스를 전달하기 전에 클래스를 인스턴스화하게하고 DisplayObject가 API 클래스를 확장하여 필요한 모든 기능을 수행하도록 요구할 수 있습니다. 그것은 자주 발생하는 한계이며 아직 만족스러운 해결책을 찾지 못했습니다. – shanethehat

+0

아,이 수정 프로그램을 사용하지 않아도됩니다. 이 솔루션을 보여주기 위해 코드를 업데이트 하겠지만 실제로 시도한 내용이 맞기 때문에 답변을 수락합니다. – TheDarkIn1978

1

클래스를 객체로 처리 할 수 ​​있다는 사실을 알고 있습니까?

내 서클 :

package 
{ 
    //Imports 
    import flash.display.Shape; 

    //Class 
    public class MyCircle extends Shape 
    { 
     //Constructor 
     public function MyCircle(color:uint, radius:uint); 
     { 
      graphics.beginFill(color, 1.0); 
      graphics.drawCircle(0, 0, radius); 
      graphics.endFill(); 
     } 
    } 
} 

캔버스 :

package 
{ 
    //Imports 
    import flash.display.DisplayObject; 
    import flash.display.Sprite; 
    import flash.utils.getDefinitionByName; 

    //Class 
    public class Canvas extends Sprite 
    { 
     //Constructor 
     public function Canvas(classToCreate:Class, amount:uint) 
     { 
      for (var i:uint = 0; i < amount; i++) 
      { 
       var randomColor:uint = Math.random() * 0xFFFFFF; 
       var randomRadius:uint = Math.random() * 100 + 50; 

       var circleInstance:DisplayObject = new classToCreate(randomColor, randomRadius); 
       circleInstance.y = i * randomRadius; 

       addChild(circleInstance); 
      } 
     } 
    } 
} 

MainClass :

package 
{ 
    //Imports 
    import flash.display.Sprite; 

    //Class 
    public class MainClass extends Sprite 
    { 
     //Constructor 
     public function MainClass() 
     { 
      var myCanvas:Canvas = new Canvas(MyCircle, 10); 
      addChild(myCanvas) 
     } 
    } 
} 
당신이 이런 일을 할 수있는 일을하려고하는지에 따라

관련 문제