【发布时间】:2016-10-12 03:29:44
【问题描述】:
所以,我试图制作一个 finagle 服务器,与哨兵交谈(不重要),并偶然发现了一个案例,我需要同时从两个 类(不是特征)继承时间,让我们称它们为class SentryHandler extends Handler 和class TwitterHandler extends Handler,并假设我需要创建MyHandler,它继承自它们。
经过一阵愚蠢,当我认为不使用可怕的“委托模式”是不可能的时,我找到了解决方案:
trait SentryTrait extends SentryHandler
class MyHandler extends TwitterHandler with SentryTrait
现在,这让我想到:拥有“特质”概念的目的是什么?如果这个想法是强制你可以从多个特征继承但只能从一个类继承,那么它似乎非常容易绕过。听起来class 应该是继承的“主”行(您“扩展一个类具有特征”,但这也不是真的:你可以extend 一个带有(或不带)一堆其他特征的特征,而且根本没有类。
你不能实例化一个特征,但抽象类也是如此......
我能想到的唯一真正的区别是特征不能有构造函数参数。但这有什么意义呢? 我的意思是,为什么不呢?这样的事情会有什么问题?
class Foo(bar: String, baz: String) extends Bar(bar) with Baz(baz)
【问题讨论】:
-
主要思想是通过可以扩展类的实现来增强经典接口。没有看到太多要添加的内容..
-
@PavelOliynyk 好吧,这就是重点:已经有一个术语用于“通过实现增强的接口” - 它被称为“类”:)。所以,问题是为什么要创建一个新术语而不是使用现有术语。
-
如果你的层次结构看起来像这样:
trait Handler; class SentryHandler extends Handler; class TwitterHandler extends Handler; trait SentryTrait extends SentryHandler; class MyHandler extends TwitterHandler with SentryTrait这不会在 REPL 上编译。 -
文字游戏 :) 我想说的是每个人都必须接受的东西。
-
@YuvalItzchakov 在理论上,是的,但实际上...甚至没有任何意义)。
Option是一个类,但Map是一个特征(“有地图”???)。List是一个类,但Seq是一个 trait ...... " 与 "has-a" 的困境,这是相当哲学的(在不好的意义上,因为没有实际意义)。