Loading AI tools
来自维基百科,自由的百科全书
在计算机科学中,元对象(metaobject)是操纵、创建、描述或实现对象(包括自身)的对象。适用于元对象的对象叫做基础对象。元对象可以定义的一些信息包括:基础对象的类型、接口、类、方法、特性、解析树等。元对象是计算机科学反射概念的例子,这里的系统(通常在运行时间)能访问它自己的内部结构。反射在根本上确使一个系统能现场重写自身,在其运行时改变自己的实现[1]。
元对象协议(MOP:metaobject protocol)提供了访问和操纵对象系统的结构和行为的词汇表(协议)。元对象协议的典型功能包括[2]:
进一步的说,元对象协议不只是到底层实现的接口,转而,通过元对象协议,对象系统是依据元对象系统而递归实现的,而它自身在理论上是依据元-元对象系统来实现的,以此类推直到任意一个基础情况(对象系统的一个一致性状态)被确定,协议就自身而言,是在这些实现层级之间的递归泛函联系。
元对象协议对立于伯特兰·迈耶的开闭原则,它声称软件对象系统,应当“开放扩展”而“关闭修改”。这个原则有效的划分了,对其做出增加的扩展对象,和对其重定义的修改对象之间的不同,提出前者是需要的质量(“对象应当可以扩展来满足将来使用情况的要求”),而后者是不需要的(“对象应当提供拒绝概要修订的稳定的接口”)。元对象协议与之相反,透明的暴露对象的内部构成,和就系统自身而言的整个对象系统。实际上,这意味着编程者可以使用对象来重定义自身,可能要以非常复杂的方式。
以元对象协议方式实现对象系统,开放了彻底自主的重新设计的可能性,提供了深度灵活性,但介入了可能的复杂性,和难以理解的元稳定性问题(例如,对象系统不可以破坏性更新它自己的元对象协议,这是它的内部自我表示,但是某些更新的潜在破坏性要预测出来,是件不平凡之事,并可能难以推理),这依赖于想要的修改所传播到的递归深度[3]。由于这些原因,当元对象协议出现于一个语言之中的时候,通常被适度使用并用于特殊用途,比如以复杂方式转换其他软件或自身的软件,例如在逆向工程中用到的那些软件[4]。
在于运行时间不能获得编译的时候,元对象协议的实现就有额外的复杂性。例如,有可能通过这种协议变更类型层级,但是这么做可能导致,用可替代类模型定义编译的代码出问题。一些环境找到了有创意的解决方法,比如通过在编译时间处理元对象问题。一个好例子是OpenC++[5]。语义网的面向对象模型,比多数标准对象系统更加动态,并一致于运行时间元对象协议。例如,在语义网中模型类被预期变更它们的相互关系,并有叫做分类器的一个特殊的推论引擎,可以验证和分析演化中的类模型[6]。
第一个元对象协议,是在Xerox PARC开发的面向对象编程语言Smalltalk之中的元类。随后的Common Lisp对象系统(CLOS),受到Smalltalk协议,还有Brian C. Smith在3-Lisp作为求值器无穷塔上的原创研究的影响[7]。CLOS模型,不像Smalltalk模型,允许一个类有多于一个超类;这引起了额外的复杂性,比如有解决某些对象实例的类沿袭(lineage)的问题。CLOS还允许动态多方法分派,这是通过泛化函数来处理的,而非Smalltalk的单一分派中的消息传递[8]。描述Common Lisp中元对象协议的语义和实现的最有影响的图书,是Gregor Kiczales等人的《元对象协议的艺术》[9]。
元对象协议还广泛的用于软件工程应用中。在几乎所有的商业CASE、代码重构和集成开发环境中,都有某种形式的元对象协议,用来表示和操纵设计工件[10][11][12]。
元对象协议是实现面向方面编程的一种方式。很多MOP的早期创立者,包括Gregor Kiczales,此后成为了面向切面编程的主要倡导者。PARC雇用了Kiczales等人,为不拥有原生元对象协议的Java设计了AspectJ。
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.