如果一个AS3方法返回一个复杂类型的引用,有没有什么办法可以做到“只读”,就像你如何在C++中使用const成员函数一样?我想要使用的体系结构要求通过传递的模板对象构建自己的类...并且实际上模板对象不应该是可修改的。我目前被迫添加回调枚举器和/或许多额外的存取器方法。AS3是否提供了阻止正在修改的返回对象的方法?
0
A
回答
2
Flex有一个ObjectUtil.clone()
方法可以进行深层复制。该副本仍然可以修改,但因为它是副本,所以更改不会传播回原始。
的方法是不复杂的,所以如果你不使用Flex,只需添加这一个实用程序类:
public static function copy(value:Object):Object
{
var buffer:ByteArray = new ByteArray();
buffer.writeObject(value);
buffer.position = 0;
var result:Object = buffer.readObject();
return result;
}
1
有没有办法做到这一点在AS3中,有这样做的Sam的方式,但它仍然需要在返回它之前复制该对象,具体取决于该对象的复杂程度,它可能会影响性能。
1
不可变接口对于const正确性是近似等价的。这里有一个例子:
interface CPoint {
function get x():Number;
function get y():Number;
}
class Point implements CPoint {
private var _x:Number;
private var _y:Number;
public function get x():Number { return _x; }
public function get y():Number { return _y; }
public function set x(val:Number) { _x = val; }
public function set y(val:Number) { _y = val; }
public function normalize():void {
var length:Number = Math.sqrt(_x*_x + _y*_y);
_x /= length;
_y /= length;
}
public function Point(x:Number, y:Number) {
_x = x; _y = y;
}
}
如果你返回一个Point作为CPoint引用,那么它的字段不能被改变。你可以从一个CPoint对一个Point进行显式强制转换来强制访问,但是你可以用C++中的const强制转换做同样的事情。
不幸的是,AS3不像它应该那样支持协方差,所以对于const子对象来说事情会变得不必要地困难。例如,如果您有一个由两个点组成的Line类,那么如果您具有对该行的完全访问权限,则可能想要说line.start.x = 47;
,但允许通过不可变接口读取line.start.x
。如果存在协变,则可以这样做,但是您需要为可变属性和不可变属性添加单独的get
属性。所以,你最终会用line.cstart.x
来读CLine。这样的事情:
interface CLine {
function get cstart():CPoint;
function get cend():CPoint;
}
class Line implements CLine {
private var _end:Point;
private var _start:Point;
public function get cend():CPoint { return _end; }
public function get cstart():CPoint { return _start; }
public function get end():Point { return _end; }
public function get start():Point { return _start; }
public function Line(x1:Number, y1:Number, x2:Number, y2:Number) {
_start = new Point(x1, y1);
_end = new Point(x2, y2);
}
}
0
我会创建一个flash.utils.proxy对象。您可以创建一个代理对象,该代理对象具有只读的传入子项的实现。
以下是用于创建代理对象的文档。 http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/utils/Proxy.html
注意:代理服务器的速度很慢,因为您将绕过本地对象检查,并用函数调用替换它 - 在使用很多时会很慢。我会先做一些简单的性能测试。
注意:这是伪代码。
use namespace flash_proxy;
dynamic class ReadOnly extends flash.utils.Proxy {
private var target:Object;
public function ReadOnly(target:Object) {
this.target = target;
}
flash_proxy function getProperty(name:*):*
return target[name];
}
flash_proxy function setProperty(name:*, value:*):void
// throw an error or do nothing
}
}
然后你可以这样做:
var readOnly:ReadOnly = new ReadOnly(stage.loaderInfo.parameters);
readOnly.someparameter = 'newvalue';
trace(readOnly.someparameter); // should be old value
相关问题
- 1. 是否复制了返回的对象?
- 2. 方法体系结构,返回提供的对象
- 3. mutator方法是否可以修改变量/对象并将其返回?
- 4. 阻止返回null的方法java
- 5. Python方法:修改原VS返回不同的对象
- 6. 返回的对象修改的java
- 7. Java是否提供了迭代多个单独对象的方法?
- 8. Zend是否为Zend_XmlRpc返回值提供对象包装?
- 9. 如何防止方法调用方修改返回的集合?
- 10. 修改方法的返回值
- 11. 阻止db4o在同一时间返回相同的对象
- 12. 检测是否至少修改了对象的一个属性
- 13. 对于null对象有方法返回值是否有用?
- 14. ruby是否提供了显示层次调用的方法?
- 15. PowerShell是否提供了创建函数注释的方法?
- 16. 我可以阻止修改Python中的对象吗?
- 17. Rails提供修改属性的方式
- 18. 在循环内异步更改对象,然后返回修改的对象
- 19. 将对象返回方法
- 20. 返回的python对象方法的Intellisense
- 21. 是否有可能修改jQuery对象和检索所修改的对象
- 22. Twitter iOS API是否提供了确定推文是否成功的方法?
- 23. 建模提供多种服务的对象的正确方法是什么?
- 24. Android是否提供了可供开发的日历算法?
- 25. 告诉对象是否被修改的最好方法是什么?
- 26. 停止正在记录的字段更改作为对POCO对象的修改
- 27. 一组对象及其状态的修改和回滚方法
- 28. 显式检入方法返回对象是否为零?
- 29. 是修改输入参数并返回错误的方法吗?
- 30. 如果提供了uri,managedQuery方法返回null会是什么情况?
是你能找到这个问题的答案? – Gunslinger47 2010-11-03 09:08:32