介绍新方法

发布者:    |       Ceylon

Ceylon最好的特性之一是词法作用域的介绍,我们在这里讨论了它,称之为装饰

我最近得出结论,显式的装饰语句是模块化的障碍,并决定采用略不同的方法。在这种方法中,一个接口可以声明它适配另一个类型

doc "Adaptor that introduces List to Sequence."
see (List,Sequence)
shared interface SequenceList<T> 
        adapts Sequence<T>
        satisfies List<T> {
    
    shared actual default List<T> sortedElements() {
    	//define the operation of List in
    	//terms of operations on Sequence
        return asList(sortSequence(this));
    }
    
    ...
    
}

然后该接口被称为介绍 - 或者,作为对Go4书中术语的致敬,称为适配器。(在该书中,“装饰器”是一个略有不同的概念。)根据规范

接口不得
  • 声明或继承一个成员,该成员精炼了任何适配类型的成员,或者
  • 声明或继承一个形式或非默认 实际成员,除非该成员是从适配类型继承的。

现在,为了在某个编译单元中启用介绍,您只需导入它。

import ceylon.collection { SequenceList }    //import the adapter

String[] cities = { "Melbourne", "Atlanta", "San Francisco", "Guanajuato", "Paris" };
List<String> sortedCities = cities.sortedElements();    //call the adapter

再次,根据规范

如果,在某个编译单元中,多个某种适配类型的介绍声明或继承了一个成员,该成员精炼了共同超类型的共同成员,那么
  • 必须有一个唯一的成员来自成员集,称为最精炼的成员,以精炼所有其他成员,或者
  • 适配类型必须声明或继承一个成员,该成员精炼所有成员。
在运行时,对任何是所有适配类型子类型的类型的操作(方法调用、成员类实例化或属性评估)根据以下规则分发
  • 如果适配类型的实例的运行时类型声明或继承了一个定义操作的成员,则操作被分发到实例的运行时类型。
  • 否则,操作被分发到具有最精炼成员定义操作的介绍。

我认为这是一个显著更好的方法,使介绍更容易使用。

更新:一位评论者询问Ceylon是否会支持C#风格的扩展方法。不需要。适配器的每个具体方法都是一个扩展方法!确实,没有适配器满足条款仅仅是扩展方法和属性的集合。


返回顶部