연초를위한 멋진 간단한 하나!
'takeDamage'함수를 정적 메서드로 선언했습니다. 즉, Ship 클래스의 특정 인스턴스에 속하지 않으며 클래스 자체에 속합니다. 정적 메서드와 속성, 당신은 OOP를 처음 사용하는 경우 약간 혼란 스러울 수 있지만 쉽게 간단한 예를 통해 설명 :
클래스 회원 재산권
이 예에서 우리 선박에 대한 새로운 클래스 정의를 선언 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의 모든 인스턴스에서 공유됩니다. 예를 들면 : 모두 StaticShips 10에서 이동 방법
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
공지 사항 - 우리가 마지막으로 '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);
주어진 클래스의
모든 경우 (예에 대한 동작을 정의 할 때
// 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
정적 방법이 유용하다 :
대신, 우리는 이제 단지 StaticMethodShip 클래스에 setSpeed () 메소드, 즉를 호출 할 수 있습니다 : 모든 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'라는 새 정적 속성을 도입 할 수 있습니다. 일반적으로 static 속성은 모든 CAPS에 작성되어 멤버 속성과 구분됩니다. kill()
메서드를 정적으로 만듭니다.
희망이 도움과 행운을 빕니다! Jonny.
지금 당장 바보 같지만 어떻게 그 방법의 인스턴스를 만들 수 있습니까? 아마 그렇게 쉽지만, 나는 그것을 찾을 수 없다. –
@RobbeVanWinckel 메서드의 인스턴스를 만들 수 없습니다. 문제는 takeDamage()가 Ship 클래스 자체에 속하는 메서드라는 것입니다 (Ship 유형의 객체가 아닙니다!). 나머지 코드를 살펴보면 takeDamage() 및 상태 변수에서 "정적"키워드를 제거하기 만하면됩니다.이 키워드는 플레이어 (인스턴스)에 속한 것처럼 보입니다. – weltraumpirat
@weltraumpirat 문제는 다른 클래스에서이 메서드를 사용한다는 것입니다. static이라는 단어를 제거하면 '오류 # 1119 : 정적 유형 Class가있는 참조를 통해 maxHealth가 아닌 정의되지 않은 속성에 액세스 할 수 있습니다.' 어떻게 해결할 수 있습니까? –