技术开发 频道

C++开发者:Objective-C的历史和原理

  对象模型

  术语面向对象是由Alan Kay在19世纪60年代提出的。他一直和一个在Xerox PARC的小组从事开发Smalltalk语言,并且这种语言作为编程模型思想的具体体现。

  面向对象编程最基础的想法是通过简单的计算机模型来传递消息。这非常有别于C++方式,C++有点类似面向对象,但它基于函数和数据结构结合的思想。

  在C++中,对象是一系列与函数有关的结构,而这些函数或是静态的或是虚的。一个静态函数语义上等价于一个C函数,这个函数隐含的第一个参数包含着对象。这完全是对C的无指针拓展,因为下面两个是相等的。

  //C++

  object->function();

  //C

  function(object);C++版本更多的作为代表,但并没有任何语义上区别。

  C++在虚成员函数的格式上也支持一些变通。在先前的例子里如果函数是个虚函数,真正的函数调用取决于对象的类。如果它是静态的,调用函数取决于调用者所考虑类的对象。

  在Objective-C,没有等价于静态成员函数。如果你想要这个功能, 你只能使用C函数。Objective-C中的方法与C++中的虚方法非常相似,但有一些重要的区别。首先是语法不同:

  [object message];发送命名消息到对象。执行代码作为这个行为的结果,而这完全取决于对象的类。这一点非常不同于C++的等价:在C++中,这种机制稍[FS:PAGE]微取决于所考虑类的对象。

  假设你有一个类继承于四个类。A是父类,B和C是A的子类,D是B的子类。在C++中,除了A其他的类都实现虚函数doSomething(),你可以称这种方式叫模板。考虑下面:

  object.doSomething();如果你认为对象是类B或D的,并且实际上是类D的对象。实现声明通过D被调用。如果你认为是类C的,将通过C的实现来调用。如果你认为是A的一个实例,你需要尝试两个显式动态映射并且看看哪一个起作用,或是否使用同一个模板。

  如果你在Objective-C中有相同的类约定,用B、C和D实现一个doSomething方法,你可以尝试如下:

  [object doSomething];如果你认为对象是B类型的,但其实是C类型的,doSomething方法依然会被调用。如果你认为是类A的实例,编译时警告弹出,A的实例没有回应一个doSomething消息。如果真的是B、C或是D的实例,它将在运行时起作用,但它是A的一个实例,运行时异常将会弹出。

  多继承在Objective-C中没有实现,但相对于C++来说远远没必要。在C++中,方法的查找基于继承链,所以你无法使用两个类继承,除非他们有共同的父类。在Objective-C中,你可以完全使用两个类在回应相同消息的条件下进行交互。

  总结

  我们已经浏览了Objective-C的历史和语言背后的核心思想。我们也发现了一些语言的重要部分:给对象发消息。在第二部分,我们会看到更多的核心语法。

0
相关文章