我遇到一个问题,我正在尝试创建一个小应用程序,这是我第一次尝试和处理类但由于某种原因我不能创建该类的任何实例,即使它被导入到该文件。这是该类的代码(名为“玩家”):
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,但老实说我不明白为什么,flash在代码提示中选择了它,但它提出了它!任何帮助,将不胜感激。
同样是次要问题,我永远不会启动Player类(除了通过继承其他类),所以我可以将其设为私有吗?
由于
答案 0 :(得分:4)
我假设所有代码都在名为Players.as
的文件中。
这是错误的。每个文件应包含一个类,并且该类应与.as
文件的名称相同。
您目前在一个文件中有两个类(Player
和Citizen
)。
您需要做的是参加您定义的Player
课程,并将其放在自己的.as
中。具有相同名称的文件(播放器)。对Citizen
执行相同的操作。
然后你可以使用:
import Player;
import Citizen;
虽然这不是必需的,因为您不需要导入与您尝试访问它的目录相同的目录中的类。
至于错误,你得到的是因为Flash正试图找到类Players
而你没有一个具有该名称的类(只是一个具有该名称的文件)。
答案 1 :(得分:4)
根据您关于ActionScript是否支持私有类的第二个问题,如果您有一个除了公共类内部无法访问的类,您可以将其定义为内部类。
当前包内的引用可以看到内部类。
如果您不希望在包外部公开显示类,请将该类放在包中并使用internal属性标记该类。或者,您可以省略内部属性和公共属性,编译器会自动为您添加内部属性。您还可以将类定义为仅在定义它的源文件中可见。将类放在源文件的底部,位于包定义的右大括号下面。
在以下示例中,X
和Y
类都在单个文件(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.");
}
}
当一个类需要小型数据模型时,这种模式非常有用,否则这些模型无法在类之外访问。
答案 2 :(得分: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";
}
}
}
不幸的是,没有抽象类,因为这将是抽象类和抽象方法的理想情况。