这个问题有点傻。我正在尝试实施技能更新系统。所以要解释一下。
有一个班级
class AppInfo
{
public static var power:int = 10;
public static var speed:int = 20;
}
和类SmartButton,它应该引用一个静态变量,例如在构造函数中强大并在给定值上增加它。
e.g。
class SmartButton
{
public function onClick(skillReference:int = <AppInfo.power>, incrementVAlue:int = 10)
{
skillReference += incrementVAlue
}
}
我希望这段代码能够更新AppInfo类中的权力值。但这不会发生......我假设因为技能作为价值传递而不是作为参考......
你能建议一种解决任务的方法吗?
由于
答案 0 :(得分:2)
您的假设是正确的,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
。
除此之外,我认为有几种方法可以抽象出你想要的东西。一种方法是使用接口并利用一些依赖注入。
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
引用。
另一种方法是使用功能性方法。
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
那么使用默认工作程序。然后您可以通过更改传入的闭包来换出更改的属性。例如,如果您想要更改speed
,则可以调用:
var smartButton:SmartButton;
smartButton.onClick(function(val:int):void { AppInfo.speed += val});
不尽如人意,但它完成了工作。
答案 1 :(得分:1)
Interface Command {
function execute():void;
}
Class UpdatePower implements Command {
private var appInfo:AppInfo;
private var delta:int;
public function UpdatePower(appInfo:AppInfo, delta:int) {
this.appInfo = appInfo;
this.delta = delta;
}
public function execute():void {
appInfo.delta += delta;
}
}
Class SmartButton {
var command:Command;
public function SmartButton(command:Command) {
this.command = command;
}
public function onClick(event:Event):void {
command.execute();
}
}
答案 2 :(得分:0)
我可能会以稍微不同的方式实现它。
也许像是;
class Properties {
private var _properties:Dictionary = new Dictionary();
public function setValue(key:String, value:int) {
_properties[key] = value;
}
public function getValue(key:String):int {
if( !_properties[key] ) return 0;
else return _properties[key];
}
public function modifyValue(key:String, value:int) {
setValue(key, getValue(key) + value);
}
}
class SmartButton
{
public function onClick(target:Properties, key:String, incrementValue:int = 10) {
target.modifyValue(key, incrementValue);
}
}
或类似的东西。