2012-07-16 47 views
0

我有一個小應用程序的問題我正在嘗試創建,這是我第一次嘗試和處理類,但由於某種原因,我即使將其導入到文檔中,也不能創建該類的任何實例。這裏是(命名爲「玩家」)的類代碼:AS3:類型未找到或不是一個編譯時常量

package 
{ 
public class Player 
{ 
    public function Player(name_:String) 
    { 

    } 

    public var name_:String; 
    private var alignment:int; 
    public var healed:Boolean = false; 
    public var revealed:Boolean = false; 
    public var attacked:Boolean = false; 
    public var dead:Boolean = false; 

    public function action(target:Player) 
    { 

    } 

    public function describe():String 
    { 

    } 
} 

public class Citizen extends Player 
{ 
    public function Citizen(name_:String) 
    { 
     alignment = 1; 
    } 

    override public function action(target:Player) 
    { 

    } 

    override public function describe():String 
    { 
     return "Citizen"; 
    } 
} 

public class Investigator extends Player 
{ 
    public function Investigator(name_:String) 
    { 
     alignment = 1; 
    } 

    override public function action(target:Player) 
    { 
     target.revealed = true; 
    } 

    override public function describe():String 
    { 
     return "Cop"; 
    } 
} 

public class Doctor extends Player 
{ 
    public function Doctor(name_:String) 
    { 
     alignment = 1; 
    } 

    override public function action(target:Player) 
    { 
     target.healed = true; 
    } 

    override public function describe():String 
    { 
     return "Doctor"; 
    } 
} 

public class Mafioso extends Player 
{ 
    public function Mafioso(name_:String) 
    { 
     alignment = -1; 
    } 

    override public function action(target:Player) 
    { 
     target.attacked = true; 
    } 

    override public function describe():String 
    { 
     return "Mafia"; 
    } 
} 
} 

和創建實例代碼:

進口玩家;

stop(); 

var totalplayers:Number; 
var playerArray:Array = new Array(); 
var playerType:Array = ["Citizen","Cop","Doctor","Mafia"]; 

var test:Citizen = new Citizen("James"); 

兩者都在同一個文件夾中。我得到了標題中描述的錯誤代碼1046,但我真的不知道爲什麼,閃存在代碼提示中挑選它,但它提出了!任何幫助,將不勝感激。還有第二個問題,我永遠不會啓動Player類(除了通過繼承其他類),所以我可以使它私人?

感謝

回答

4

我假設所有的代碼是在一個名爲Players.as文件。

這是錯誤的。每個文件應包含一個類別,並且該類別應該與.as文件具有相同的名稱。

您目前在一個文件中有兩個類(PlayerCitizen)。

你需要做的是把你定義的Player類放在它自己的.as中。具有相同名稱的文件(播放器)。對Citizen做同樣的事情。

然後你可以使用:

import Player; 
import Citizen; 

雖然這不會是必要的,因爲你並不需要導入在同一個目錄中的類,你試圖從訪問它。

至於錯誤,你得到的是因爲Flash試圖找到類Players,並且你沒有一個具有該名稱的類(只是具有該名稱的文件)。

+0

啊,我覺得一個軟件包本身就可以接受一堆課程(似乎有點暗示了這個名字,但是吸取了教訓!)。謝謝您的幫助! – 2012-07-16 07:28:28

+0

@JamesMcGrath一個包不需要一堆類,它們只需要放在單獨的文件中。包反映文件夾結構,所以如果你將一堆.as文件放到一個名爲「environment」的文件夾中,那麼每個文件頂部的包定義將是'package environment',並且該包中的每個類都會需要通過'import environment.ClassName'導入。讓我知道如果這是有道理的:) – Marty 2012-07-16 07:56:15

+0

這確實,閃光已混淆了一段時間,因爲即使我列出了一個文件中的所有類(最初在通過'package com'引用的文件夾「com」中),何時導入它們在代碼提示中單獨出現的類,所以我認爲它工作正常:P – 2012-07-17 00:42:01

4

關於ActionScript是否支持私有類的第二個問題,如果您有一個不會以其他方式訪問的類,除非內部由公共類訪問,您可以將其定義爲內部類。

內部類對當前包內的引用可見。

如果您不希望某個類在包外公開可見,請將該類放入包中,並用該內部屬性標記該類。或者,您可以省略內部屬性和公共屬性,編譯器會自動爲您添加內部屬性。您還可以定義一個類,使其僅在定義它的源文件中可見。將該類放在源文件的底部,位於包定義的結束括號內。

在下面的示例中,XY類都在單個文件(X.as)中定義。X可能會被正常引用和實例化;然而,Y內部爲X,僅在X範圍內可見。

package 
{ 
    import flash.display.Sprite; 

    public class X extends Sprite 
    { 
     public function X() 
     { 
      super(); 

      var y:Y = new Y(); 
     } 
    } 
} 

internal class Y 
{ 
    public function Y() 
    { 
     trace("internal Y ctor."); 
    } 
} 

當一個類需要的小數據模型不會在類之外訪問時,這種模式很有用。

1

與他人同意應該如下圖所示(注意文件名與類名匹配,文件名在上面的代碼塊中用括號表示)。此外,您還編寫了導入播放器,而不是導入播放器,無論其他海報如果當前所有類都處於默認包中,都不需要導入。

[Player.as]

package 
{ 
    public class Player 
    { 
     public function Player(name_:String) 
     { 

     } 

     public var name_:String; 
     private var alignment:int; 
     public var healed:Boolean = false; 
     public var revealed:Boolean = false; 
     public var attacked:Boolean = false; 
     public var dead:Boolean = false; 

     public function action(target:Player) 
     { 

     } 

     public function describe():String 
     { 

     } 
    } 
} 

[Citizen.as]

package 
{ 
    public class Citizen extends Player 
    { 
     public function Citizen(name_:String) 
     { 
      alignment = 1; 
     } 

     override public function action(target:Player) 
     { 

     } 

     override public function describe():String 
     { 
      return "Citizen"; 
     } 
    } 
} 

[Investigator.as]

package 
{ 
    public class Investigator extends Player 
    { 
     public function Investigator(name_:String) 
     { 
      alignment = 1; 
     } 

     override public function action(target:Player) 
     { 
      target.revealed = true; 
     } 

     override public function describe():String 
     { 
      return "Cop"; 
     } 
    } 
} 

[Doctor.as]

package 
{ 
    public class Doctor extends Player 
    { 
     public function Doctor(name_:String) 
     { 
      alignment = 1; 
     } 

     override public function action(target:Player) 
     { 
      target.healed = true; 
     } 

     override public function describe():String 
     { 
      return "Doctor"; 
     } 
    } 
} 

[Mafioso.as]

package 
{ 
    public class Mafioso extends Player 
    { 
     public function Mafioso(name_:String) 
     { 
      alignment = -1; 
     } 

     override public function action(target:Player) 
     { 
      target.attacked = true; 
     } 

     override public function describe():String 
     { 
      return "Mafia"; 
     } 
    } 
} 

這是不幸沒有抽象類,因爲這將是一個抽象類,抽象方法的理想局面。

+0

難道我不能讓Player抽象嗎? – 2012-07-16 07:29:35

+0

不幸的是,在AS3中沒有抽象關鍵字,這是讓我對這門語言感到厭煩的幾件事之一。缺乏方法/函數重載(儘管...作品或通用對象)以及缺少線程是我對AS3最大的擔憂。 – shaunhusain 2012-07-16 17:45:39

+0

如果這就是我的想法,玩家是抽象的,有一些抽象的方法,子類然後實現,這是一個很好的例子,它非常方便,我不明白推出它的原因。 – shaunhusain 2012-07-16 17:47:03

相關問題