如果一個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. 返回我的對象是否正確?
- 4. mutator方法是否可以修改變量/對象並將其返回?
- 5. 阻止返回null的方法java
- 6. Python方法:修改原VS返回不同的對象
- 7. 返回的對象修改的java
- 8. Java是否提供了迭代多個單獨對象的方法?
- 9. Zend是否爲Zend_XmlRpc返回值提供對象包裝?
- 10. 如果我正在修改它,是否需要從方法返回一個對象?
- 11. 修改Mongoose返回的對象
- 12. 如何防止方法調用方修改返回的集合?
- 13. 提供了糖*和*對象方法在穆斯的作用
- 14. 您是否測試只修改對象狀態的方法?
- 15. 在運行時修改抽象方法的返回值
- 16. Java RMI:阻止void方法返回?
- 17. Object.toString或Object.hashCode是否提供了對象的內存地址
- 18. AS3修改舞臺上的對象
- 19. 修改方法的返回值
- 20. 返回JSON對象,提供空數據
- 21. C#是否爲引用類型對象提供了「正確的」const?
- 22. 檢測是否至少修改了對象的一個屬性
- 23. 判斷putIfAbsent是否修改了ConcurrentHashMap的正確方法是什麼?
- 24. 阻止db4o在同一時間返回相同的對象
- 25. 對於null對象有方法返回值是否有用?
- 26. 提供了界面對象
- 27. ruby是否提供了顯示層次調用的方法?
- 28. PowerShell是否提供了創建函數註釋的方法?
- 29. 修改S3對象而不返回它?
- 30. 修改和對象返回.InRequestScope(Ninject)
是你能找到這個問題的答案? – Gunslinger47 2010-11-03 09:08:32