あなたの前提は正しく、ints
は参照ではなく値渡しとなります。一つの直接的なアプローチは、参照型(class
)よりもむしろ値型に電源をカプセル化することであろう。
class Skill {
public var value:int;
public function Skill(val:int) {
this.value = val;
}
}
class AppInfo
{
public static var power:Skill = new Skill(10);
public static var speed:Skill = new Skill(20);
}
そしてpower
を通過するインスタンスへの参照として渡す必要があります。代わりにskillReference.value
を使用するためにあなたの実装を少し変更する必要がありますが。
それ以外にも、あなたが望むものを抽象化する方法がいくつかあると思います。 1つの方法は、インターフェースを使用し、依存性注入を活用することです。
interface ISkills
{
function get power():int;
function set power(val:int):void;
}
class AppInfo implements ISkills
{
private static _power:int = 0;
public function get power():int { return _power; }
public function set power(val:int):void { _power = val; }
}
class SmartButton
{
public function onClick(skills:int = ISkills, skill:String = "power", incrementVAlue:int = 10)
{
skills[skill] += incrementVAlue
}
}
ここでは、使用方法を実装から切り離したいと考えています。この場合、SmartButton
は、スキルがどのように操作するのかを知る必要はありません。これは、静的クラスAppInfo
への参照を、注入可能なインスタンスのために失います。このアプローチにはいくつかの利点があります。クラスやコードを更新することなく、静的クラスが最良の実装方法ではないと判断した場合は、テストを簡単にし、実装を簡単にスワップしやすくなります。また、メソッドにISkills
を注入するのではなく、SmartButton
のコンストラクタに注入して、スキルコンテナへの参照を保持しておいてください(private
)。
もう1つのアプローチは、機能的アプローチを使用することです。
class SmartButton
{
public var defaultWorker:Function = function(val:int):void {
AppInfo.power += val;
}
public function onClick(worker:Function = undefined, incrementValue:int = 10):void
{
if(worker == undefined) worker = defaultWorker;
worker.call(this, incrementValue);
}
}
繰り返しますが、この場合には、かなりしっかりと直接AppInfo
クラスを使用するように実装を結合するよりも、あなたはそれのための「労働者」を注入し、作業者がundefined
デフォルトの労働者を使用している場合(あなたのための作業を行います渡されたクロージャーを変更することによって、どのプロパティーが変更されるかを交換することができます。それができるよう
var smartButton:SmartButton;
smartButton.onClick(function(val:int):void { AppInfo.speed += val});
ほど簡潔ではないが、それは仕事を取得します。あなたの代わりにspeed
を変更したい場合たとえば、あなたは呼ぶだろう。 command patternを使用して