trait or abstract class?

  • 首先你需要重用才需要考虑这个问题。If the behavior will not be reused, then make it a concrete class.
  • 优先使用特质。一个类扩展多个特质是很方便的,但却只能扩展一个抽象类。

If you still do not know, after considering the above, then start by making it as a trait. You can always change it later, and in general using a trait keeps more options open.

  • 优先使用trait
  1. multiple, unrelated classes, make it a trait.
  2. If outside clients will only call into the behavior, instead of inheriting from it, then using a trait is fine.
  • 优先使用abstract class
  1. 如果你需要构造函数参数,使用抽象类。因为抽象类可以定义带参数的构造函数,而特质不行。例如,你不能说trait t(i: Int) {},参数i是非法的。

    1. Abstract classes can have constructor parameters as well as type parameters.
    2. Traits can have only type parameters. There was some discussion that in future even traits can have constructor parameters
  2. 对于与java互动:优先abstract class
    1. Abstract classes are fully interoperable with Java. You can call them from Java code without any wrappers.
    2. Traits are fully interoperable only if they do not contain any implementation code
  3.  compiled form分布的,有外部其他类继承
    1. The issue is that when a trait gains or loses a member, any classes that inherit from it must be recompiled, even if they have not changed.
  4. 需要高效率--不一定,在肯定trait导致bottleneck时可以使用abstract class
  5. in classes, super calls are statically bound, in traits, they are dynamically bound.
    1. If you write super.toString in a class, you know exactly which method implementation will be invoked.
    2. When you write the same thing in a trait, however, the method implementation to invoke for the super call is undefined when you define the trait.

REFERENCE

stackoverflow: Scala特质 vs 抽象类 , 抽象类和特质的区别, and Scala编程: 用特质,还是不用特质?

http://www.artima.com/pins1ed/traits.html

时间: 2024-11-10 18:40:03

trait or abstract class?的相关文章

快学Scala 第十九课 (trait的abstract override使用)

trait的abstract override使用: 当我看到abstract override介绍的时候也是一脸懵逼,因为快学scala,只介绍了因为TimestampLogger中调用的super.log依旧是个abstract class,所以必须在方法前加上abstract和override.但是并没有具体介绍如何使用,然后查阅了其他文档,才明白使用方法. 下面的代码定义了超类LoggerEmpty,这个定义意味着该特质只能混入扩展LoggerEmpty的类中. 在特质中声明抽象方法中有

trait,interface,abstract,PHP7新特性以及PHP闭包学习

1月8日trait 自PHP5.4.0起,PHP实现了一种代码复用的方法 称为traittrait 是为 PHP这类单继承语言准备的一种代码复用机制 .trait 为了减少单继承语言的限制,使开发者可以在不同层级中独立的调用 trait中的 方法 trait和类的组合使用,避免了一般类的多继承和混入类(Mixin)相关的典型问题. trait 类似于一个类trait 不能被实例化 使用方法 其他类中use,既可单独调用例子:trait say{public function say_word()

如何使用Abstract类?抽象类的威力

简介: 今天我想谈谈如何使用抽象类,以及抽象类真正的威力.本文将结合具体业务来说明如何使用抽象类,由于本人接触业务时间不长,如有杠精,请您老再看下标题. 业务简述: 本人目前只接触过PMS(物业管理系统),公司主要业务的是美国的租房业务.由于美国租房和中国租房在后台可能有点差别,本文不做叙述.下面我们直入主题. 当用户点击租房之后,我们是要创建一个订单,而在创建订单的时候,需要做很多事,本文只做一个简化版的,避免偏离主题.当创建订单时,需要做以下几件事: 1.Available 检查是否可用 2

scala 用trait还是用abstract class

package com.scala.idle object TraitOrAbstractClass { def main(args: Array[String]): Unit = { } } /** * 继承两个trait,N多方便啊! */ class TestClass000 extends Trait000 with Trait001{ } /** * 继承两个abstract class,Error了.Error信息如下: * Multiple markers at this line

什么是 Trait

Trait 是从 PHP 5.4 加入的一种细粒度代码复用的语法.以下是官方手册对 Trait 的描述: Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method.Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题. Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能. 无法通过 trait 自身来实

php trait

学习: yf lr Trait, 代码复用, 变相的多继承 1 方法重名, 优先级: 当前类>trait>基类 2 多个Trait的时候, 方法重名, 可以使用insteadof筛选不需要的trait 3 trait方法重命名后, 两种调用方式都存在,不能解决命名冲突 4 重命名可以设置访问权限,但是之前的访问权限没有改变 5 可以将多个trait组合成一个trait 6 trait可以包含抽象方法,在使用的时候需要重新实现 7 trait可以被静态成员静态方法定义 8 如果trait定义了一

Beginning Scala study note(7) Trait

A trait provides code reusability in Scala by encapsulating method and state and then offing possibility of mixing them into classes thus allowing code reuse. #define Trait Gliding scala> trait Gliding{ | def gliding(){ println("gliding")} |

spring中abstract bean的用法

什么是abstract bean?简单来说,就是在java中的继承时候,所要用到的父类. 案例文件结构: 其中Person类为父类,Student类为子类,其具体类为: package com.test.mySpring; public class Person { public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge()

Partial(部分方法,局部方法),virtual(虚方法),abstract(抽象方法)

Partial 部分方法顾明思议是方法的一部分,不完整的,在ide编译时候,会将所有部分方法加载到一起统一编译,如果分部方法没有被实现,编译器就不会.对他们进行编译. 局部类型的限制 (1) 局部类型只适用于类.接口.结构,不支持委托和枚举.(2) 同一个类型的各个部分必须都有修饰符 partial.(3) 使用局部类型时,一个类型的各个部分必须位于相同的命名空间中.(4) 一个类型的各个部分必须被同时编译. 3. 局部类型的注意点 (1) 关键字partial是一个上下文关键字,只有和 cla