不错,简单的一个在今年年初!
您已将函数'takeDamage'声明为静态方法 - 这意味着它不属于类Ship的特定实例,而是它属于类本身。静态方法和属性可以是一个有点混乱,如果你是新的面向对象,而是通过一个简单的例子是很容易解释:
类成员属性
在这个例子中,我们声明一个新的类定义为船舶我们可以通过setSpeed()来定义船舶实例的速度。
public class Ship {
private var speed : Number;
public function setSpeed(value : Number) : void {
this.speed = value;
}
public function getSpeed() : Number {
return this.speed;
}
}
现在我们将创建一对夫妇的船只,并设置其速度:
var scoutShip : Ship = new Ship();
scoutShip.setSpeed(500); // Scout's are fast!
var cargoShip : Ship = new Ship();
cargoShip.setSpeed(10); // Cargo ships are sloooow.
trace("Scout Ship Speed: " + scoutShip.getSpeed()); // 500
trace("Cargo Ship Speed: " + cargoShip.getSpeed()); // 10
正如你可以从上面看到,船舶,我们创建的每个新实例可以拥有自己的速度 - 这是面向对象编程的基础(船舶是对象,速度就是数据)。
静态属性
现在,我们将创建另一个类,这段时间称为StaticShip它采用了静态的属性,而不是,请注意使用静态关键字:
public class StaticShip {
private static var speed : Number;
public function setSpeed(value : Number) : void {
this.speed = value;
}
public function getSpeed() : Number {
return this.speed;
}
}
因为速度属性是静态的,它在StaticShip的所有实例中共享;例如:
var scoutShip : StaticShip = new StaticShip();
scoutShip.setSpeed(500); // So the scout should move at 500
var cargoShip : StaticShip = new StaticShip();
cargoShip.setSpeed(10); // ... and the Cargo move at 10, as before
trace("Scout Ship Speed: " + scoutShip.getSpeed()); // 10
trace("Cargo Ship Speed: " + cargoShip.getSpeed()); // 10
注意如何既StaticShips 10移动 - 这是因为我们设置了“cargoShip”比如去年的速度 - 在StaticShip的“速度”属性声明静态它跨越共享该类的所有实例。
现在,就像您可以在类中具有静态属性一样,您也可以具有静态函数。通常,当你调用一个类的方法(例如:setSpeed())时,你需要在一个实例上调用该方法(即:scoutShip.setSpeed(500);
),然而,静态方法允许你与给定类的其他静态成员进行交互,这里是另一个例如:
静态方法示例现在
public class StaticMethodShip {
private static var speed : Number;
// Note that setSpeed is now declared as static
public static function setSpeed(value : Number) : void {
this.speed = value;
}
public function getSpeed() : Number {
return this.speed;
}
}
,我们仍然可以像以前一样创建StaticMethodShip的新实例,但是因为我们现在已经宣布“setSpeed”为静态的,我们不能调用setSpeed上一个实例:
var scoutShip : StaticMethodShip = new StaticMethodShip();
// This call will trigger Error #1180 - Call to a possibly undefined Method because
// setSpeed was declared as static.
scoutShip.setSpeed(500);
相反,我们现在只能调用在StaticMethodShip类setSpeed()方法,即:当你要定义给定类的所有情况下(即行为
// Set the speed of all StaticMethodShip instances.
StaticMethodShip.setSpeed(250); // all StaticMethodShips travel at 250.
// Proof!
var shipOne : StaticMethodShip = new StaticMethodShip();
var shipTwo : StaticMethodShip = new StaticMethodShip();
trace("ShipOne Speed: " + shipOne.getSpeed()); // 250
trace("ShipTwo Speed: " + shipTwo.getSpeed()); // 250
静态方法是有用的:所有StaticMethodShips以指定速度移动,全部淡出Tweens持续0.25秒等等);但他们也共同使用的设计模式,如Static Factory Method
现在,你看到你的错误的原因 - 成员级别方法能够调用静态方法,即:
public class StaticExampleOne {
public static function getName() : String {
return "Robbe";
}
public function traceName() : void {
// traces 'Robbe'.
trace(getName());
}
}
在使用( new StaticExampleOne().traceName()
)这工作得很好 - 成员方法可以访问静态方法没有问题,但是这并不工作周围的其他方法:
public class StaticExampleTwo {
private var name : String = "Robbe";
public function getName() : void {
return this.name;
}
public static function traceName() : void {
// Throws Error #1180.
trace(getName());
}
}
这是因为静态方法没有范围(即:他们不知道是哪个插件因为它们只能引用其他静态成员),因此无法访问类成员(方法和属性)。
为了解决您的问题,您可以向船舶引入一个名为'STAGE'的静态属性(通常静态属性用全部大写写入,以区分它们与成员属性),然后使您的方法保持静态。
希望这会有所帮助,祝你好运! 乔尼。
我现在觉得很愚蠢,但我该如何做一个方法的实例?这可能很容易,但我找不到它。 – 2012-01-03 21:38:52
@RobbeVanWinckel你不能创建一个方法的实例。问题是takeDamage()是属于类Ship的一种方法(不是Ship类型的对象)。从其他代码判断,你可能只想从takeDamage()和health变量中删除“static”关键字 - 它们似乎属于一个玩家(实例)。 – weltraumpirat 2012-01-03 21:45:08
@weltraumpirat问题是我在另一个类中使用该方法,如果我删除单词static,则会给出错误#1119:通过静态类型Class的引用访问可能未定义的属性maxHealth。那我该如何解决呢? – 2012-01-03 21:54:10