特质(计算机编程)
编辑在计算机编程中,特质是一个用于面向对象编程的概念,它表示一组可以用来扩展类的功能的方法。
特质(计算机编程)的理由
编辑在面向对象编程中,行为有时会在互不相关的类之间共享。例如,许多不相关的类可能有方法将对象序列化为JSON。在历史上,有几种方法可以解决这个问题,而不需要在每个需要该行为的类中重复代码。其他的方法包括多重继承和混合器,但这些都有缺点:如果混合器的应用顺序被改变,或者在父类或混合器中添加了新的方法,那么代码的行为可能会意外地改变。特质通过允许类使用特质并获得所需的行为来解决这些问题。如果一个类使用了一个以上的特质,使用特质的顺序并不重要。特质所提供的方法可以直接访问类的数据。
特质(计算机编程)的特征
编辑特质结合了协议(接口)和混合器的各个方面。像接口一样,特质定义了一个或多个方法签名,实现类必须提供这些签名的实现。就像一个混血儿,特质为实现类提供额外的行为。在不同特征提供的方法之间出现命名冲突的情况下,程序员必须明确区分这些方法中的哪一个将在类中使用;从而手动解决多重继承的钻石问题。这与面向对象编程中的其他组合方法不同,在这些方法中,冲突的名称会通过范围规则自动解决。可以用特质进行的操作包括。对称和:合并两个互不相干的特征以创建一个新的特征的操作覆盖(或不对称和):通过向现有的特征添加方法形成一个新的特征的操作,可能会覆盖它的一些方法别名:通过为现有的方法添加一个新的名字创建一个新的特征的操作排除:通过从现有的特征中删除一个方法形成一个新的特征的操作。(如果一个方法被排除在特质之外,该方法必须由消费该特质的类或该类的父类来提供。这是因为特质所提供的方法可能会调用被排除的方法。特质组合是换元的(即给定特质A和B,A+B等同于B+A)和关联的(即给定特质A、B和C,(A+B)+C等同于A+(B+C))。
局限性
编辑虽然特征比许多替代方法具有明显的优势,但它们也有自己的局限性。
所需的方法
编辑如果trait要求消费类提供某些方法,trait就不能知道这些方法是否与trait的需求有语义上的等同。对于某些动态语言,如Perl,所需的方法只能通过方法名来识别,而不是完整的方法签名,这就更难保证所需的方法是合适的。
排除方法
编辑如果一个方法被排除在特质之外,该方法就会成为特质的"必需"方法,因为特质的其他方法可能会调用它。
支持的语言
编辑特质最初来自于编程语言Self,被以下编程语言所支持。AmbientTalk。结合了Selftraits的特性(基于对象的多重继承)和Smalltalk的Squeaktraits(需要程序员对traits进行显式组合)。它建立在对有状态和可冻结的traits的研究上,以实现traits内的状态,这在xxx个定义中是不允许的。C#。从8.0版本开始,C#支持默认的接口方法,这些方法具有traits的一些属性。C++:在标准模板库和C++标准库中使用,支持通用容器类和BoostTypeTraits库。Curl:作为mixins的抽象类允许方法的实现,因此构成了另一个名字的traits。D:从2.003版本开始,__traits语言扩展和std.traits模块辅助模板提供了编译时traits。
与其他语言特性(特别是模板和混搭)一起,它们允许根据接口和类型灵活地自动生成方法。D还允许成员方法和变量的显式别名,包括转发到多个成员类。FortressGroovy。从2.3版本开始,Haskell。在Haskell中,Traits被称为类型类。Haxe:从2.4.0版本开始。在手册中被称为静态扩展,它使用了使用关键字Java。从第8版开始,Java支持默认方法,这些方法具有traits的一些属性。JavaScript。Traits可以通过函数和代理实现,也可以通过提供traits的库实现。Julia:有几个包实现了traits,例如Kotlin。
内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/170842/