我经常看到以下方法被描述为实现get/set方法的“正确”方式:
public class Foo {
private var _someVar:SomeClass;
public function get someVar():SomeClass {
return _someVar;
}
public function set someVar(newValue:SomeClass):void {
_someVar = newValue;
}
}
现在,因为AS3始终返回对Object类的引用,当我们使用“get”方法时,我们获得了对我们的private变量的引用 => 封装被破坏了。
即使我们没有设置方法,我们也可以修改privar var!那么将其设置为私有有什么目的呢?
我找到的唯一解决方案是在我们的get方法中返回“_someVar”的克隆版本,但我从未在任何示例中看到过这种情况。所以我觉得我在这里失去了一些东西。
你是从你的getter返回克隆对象还是接受封装的破坏?
编辑 我理解set和get方法的工作原理,并且我理解它们的好处。我询问的是当我们通过引用返回私有变量时(如果我们的变量是Number、String、int等类型,则AS3始终按值而非引用返回,因此我们在这里没有问题),我们的“私有”访问是否被破坏了(我们无法在没有setter方法的情况下设置属性,但我们可以修改它!)。
请参阅此示例:
public class Foo {
private var _someVar:Array; // note that this is a Object (not Number, String, etc)
public function Foo(){
_someVar = ['don't touch this!'];
}
public function get someVar():SomeClass {
return _someVar;
}
// note that we don't have a setter
}
var f:Foo = new Foo();
var a:Array = f.someVar;
trace(a[0]); // 'don't touch this!'
a[0] = 'why not?';
trace(f.someVar[0]); // 'why not'
因此,我们正在从外部更改私有变量,而且没有控制,即使我们没有setter方法。