Shirley M.
Shirley M.
> @MingShined 什么是面向类的语言?第一次听说,能否详细讲讲。 # 什么是Class-Based program language 在早期面向对象的语言中,大部分都是Class-based的语言,比如大名鼎鼎的**SmallTalk**(是一种面向对象的、动态类型的编程语言,这门语言对后来c++和java等面向对象的语言具有重大的意义) 所谓的class-base,或者说基于类的面向对象语言(也就是这位同学说的面向类的语言),类是对象的生成器,而我们操作的对象都是类的实例,类并不存在于运行环境中,也无法被我们所操作。类的作用就是生成一个对象实例,类保管着所生成对象的方法。 ## class-based的缺点? - 第一是不直观,我们设计类,但是实际操作的却是他的实例。程序员为了一个新增的实体需要先去设计一个抽象的类,然后再将其实例化一个实体。程序员设计的是类,而实际操作的确是类的实例,这增加了认知成本。 - 第二点是不灵活,当我们想要为某个类一个特殊实例增加一个特殊方法的时候,基于类的语言就需要进行一次继承,将特殊实例的类作为原来类的子类,并进行一次实例化。而假如我们只需要使用这个对象一次(比如ui编程中一个特殊按钮),这样繁琐的操作显然是不能让人接受的。 - 第三点是对元类的依赖:元类(mate-class)是**类的类**。(注:这里仅对部分语言而言,比如前文提到的smalltalk,以及后来Ruby,python)关于metaclass,可以看看他的设计者在[这里](https://mail.python.org/pipermail/python-dev/2001-May/014508.html)的所说的 > 所有类都是 Class类 的实例。就像对象的方法被它的类持有一样,Class也持有所有类的方法(比如创建一个新对象的方法)。 > 当对象接收到消息时,编译器会到对象的类里寻找该方法,当没有找到时,就会到类的父类里寻找,直到到达顶端也就是Class。 > 这就会遇到一个问题:类的方法会被所有类所共享。假如我们有两个类,class Point 和class Rectangle ,当我们想增加一个的类方法,比如newPointfromTwocoordinates时,这会造成class Rectangle...