今天看到一篇形象的代码举例,share给大家!
ActionScript 提供 getter 和 setter 以存取类的属性. 在 OOP 编程的角度, 是出于类的封装性考虑, 类的继承 (protected) 和私有化 (private) 的属性不能直接暴露在外, 外部只能通过存取方法访问和修改.
假设现在有一个去理发的女生, 年龄只有她自己知道, 发型师可以获知她的发质, 知道并可以改变她的发型. 那么 ActionScript 类可以定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public class Lady { // 年龄 private var _age:int; // 发质 protected var _hairQuality:String; public function get hairQuality():String { return this._hairQuality; } // 发型 private var _hairStyle:String; public function get hairStyle():String { return this._hairStyle; } public function set hairStyle(value:String):void { this._hairStyle = value; } public function Lady() { this._age = 24; this._hairQuality = "damaged"; this._hairStyle = "fashion"; } } |
由代码可以看出, 通过存取方法可以选择性地开放外部对属性的操作. 存取方法的写法也与一般的方法写法不同点在于 get 和 set 关键字. 一旦写为存取方法, 其调用方式将与常规方法不同, 将通过点运算符进行操作, 如:
1 2 3 4 | var lady:Lady = new Lady(); if(lady.hairStyle == "gliding") { lady.hairStyle = "fashion"; } |
另外, 使用存取方法还可以覆盖从超类继承来的属性, 这是常规类属性不能做到的, 可以对从超类继承的 getter 和 setter 方法使用 override 属性.
ActionScript 存取方法的思想和 C# 中 "域 (field)" 的概念几乎一样, 倡导开发者不使用 public 声明属性, 而通过 getter 和 setter 对外提供服务. 而 C# 要求同一个属性的 getter 和 setter 写在一起, 可以减少开发者遗漏和犯错.
或许因为我很长一段时间在敲 Java, 这种类似原型 (prototype) 的调用方式让我感到难受. 如果用 Java 对上面的 Lady 再写一遍, 会是这样的...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public class Lady { // 年龄 private int _age; public Lady() { this._age = 24; this._hairQuality = "damaged"; this._hairStyle = "fashion"; } // 发质 protected String _hairQuality; protected String getHairQuality { return this._hairQuality; } // 发型 private String _hairStyle; public String getHairStyle() { return this._hairStyle; } public void setHairStyle(String value) { this._hairStyle = value; } } |
Java 恨不得将所有属性设为继承和私有, 而通过对外的方法提供信息. 在外部调用时, 其调用方法与常规方法无异, 如果不是 JavaBean, 没有任何特殊要求. 好处是什么? 属性是属性, 方法是方法, 没有存取方法什么的这种特殊类型, 所以代码可以更加清晰易懂.