首页 > 面向对象编程中get set 计算属性 的设计主要作用是什么

面向对象编程中get set 计算属性 的设计主要作用是什么

诸如swift C# (其他请补充)带有 get set 的关键字 (Swift称为计算属性)。

其目的是在取值和赋值的时候执行里面的代码。

但如果目的仅仅是这样,为什么不直接使用方法(Method)的操作方式,而要属性(Properties)的操作方式?

比如 java 的get set 就是用方法模拟的(java 没有实际的get set 关键字):

class Person{
   private String name;
   public String getName(){return this.name;}
   public void setName(String name){this.name = name;}
}
//所以,在赋值的时候是使用
person.getName() / person.setName(..)进行操作

而诸如拥有get set 特性的语言(swift c#)则是直接使用 getset 关键字修饰成一个属性
swift:

class Person{
    private var _name:string?
    name{
        get ..
        set ...
    }
}

//使用时
person.name = ... 
//or
var name:string? = person.name

上述两种有什么主要区别吗?或者说分别的好处是什么?为什么要有get set 这种概念?


get set的概念就如你所说,在取值和赋值的时候执行里面的代码,可以保持外部接口不变的情况下,修改内部存储方式和逻辑。可以理解为后者是前者的语法糖。

具体可看:http://stackoverflow.com/questions/1568091/why-use-getters-and-setters

1.    When you realize you need to do more than just set and get the value, you don't have to change every file in the codebase.
2.    You can perform validation here.
3.    You can change the value being set.
4.    You can hide the internal representation. getAddress() could actually be getting several fields for you.
5.    You've insulated your public interface from changes under the sheets.
6.    Some libraries expect this. Reflection, serialization, mock objects.
7.    Inheriting this class, you can override default functionality.
8.    You can have different access levels for getter and setter.
9.    Lazy loading.

说道用处和设计目的之类的,java 和 swift 其实几乎一样。

至于为什么 swift 设计成这样,我只能说是遗传了大多 CX (代表众多基于C的面向对象语言) 的后遗症,大多数基于C的面向对象语言都是这样采用一种与众不同的方式去设计 get set 方法,而没有像 Java 一样指定一套简单通用的标准(虽然 Java 里定义 get set 繁琐了一些,但是其基础语法确实非常干净利落的)。

而为什么大多数基于C的面向对象语言都设计成这种与众不同的样式,我估计和 C 语言的 宏 这个概念有很大关系,后来者设计新的 C 语言时,大概都受其影响,所有设计的结果也都相似。

【热门文章】
【热门文章】