如何确定使用特征'''或类来"注入"?

Fre*_*ind 2 scala class traits

我很困惑地选择一个trait或者class在编写scala代码时.

起初,我有一个控制器,有with几个特点:

class MyController extends Controller 
                   with TransactionSupport 
                   with JsonConverterSupport 
                   with LoggerSupport
Run Code Online (Sandbox Code Playgroud)

在这些特征中,我定义了一些可以直接使用的方法和字段MyController.

但我的朋友说:当你extendswith一个特质时,应该be a是那种特质.

看看MyController它,它是一个Controller,但它不是一个TransactionSupport,不是一个JsonConverterSupport,不是一个LoggerSupport,所以它不应该是with它们.

所以代码变成:

class MyController(tranSupport: TransactionSupport, 
                   jsonConverter: JsonConverterSupport, 
                   loggerSupport: LoggerSupport) extends Controller
Run Code Online (Sandbox Code Playgroud)

但我对这段代码感觉不太好,这看起来很奇怪.

我看到traits在scala代码中大量使用,我什么时候应该使用它或使用类注入?

Dan*_*ral 6

我会推荐你接口应该是形容词.虽然一些特征可能扮演一个类的一部分(因此,是名词并尊重"是一个"关系),但当用作mixin时,它们往往会扮演界面的一部分.

作为一个"形容词",该特征将为他们所扩展的任何内容添加一个合格的属性.例如,它们可能是ComparableSerializable.

找到一个适合的形容词可能有点困难 - 你会用什么形容词LoggerSupport? - 所以不要觉得过分受到限制.请注意,特质是完全错误的,因为它必然是一种"是一种"的关系.

不过,我会尽量避免使用特征来代替"has-a"关系.