相关疑难解决方法(0)

抽象类与特质的区别

可能重复:
Scala特征与抽象类

抽象类和特征之间的概念差异是什么?

abstract-class scala traits

91
推荐指数
4
解决办法
5万
查看次数

Scala - 扩展vs

我很迷惑.在我现有的项目,我无法找到之间的差异extendswith.请你帮助我好吗?

scala

30
推荐指数
3
解决办法
2万
查看次数

使用密封特征和密封抽象类作为基类之间的区别

在尝试学习Akka时,我经常会发现类似于以下类的层次结构的示例:

sealed trait Message

case class TextMessage(user: String, text: String) extends Message
case class StatusMessage(status: String) extends Message
Run Code Online (Sandbox Code Playgroud)

但是,在Scala文档中有以下示例:

abstract class Notification

case class Email(sourceEmail: String, title: String, body: String) extends Notification
case class SMS(sourceNumber: String, message: String) extends Notification
case class VoiceRecording(contactName: String, link: String) extends Notification
Run Code Online (Sandbox Code Playgroud)

使用密封特征与抽象类(或本例中的密封抽象类)作为没有类层次结构的构造函数参数的基类有什么区别?使用一个优于另一个有一些优势吗?

编辑:

具体来说,如果两者,特征和抽象类都是密封的,我不能将它们扩展到文件之外,对吧?在那种情况下,我无法用Java继承它们吗?如果是这种情况,密封性将使建议的副本中找到的大多数参数无效,因为它们引用文件外的继承.

scala akka

9
推荐指数
1
解决办法
3116
查看次数

为什么我们需要Scala中的特质?

所以,我试图制作一个 finagle 服务器,与哨兵交谈(不重要),并偶然发现了一个案例,我需要同时从两个(不是特征)继承,让我们称它们为class SentryHandler extends Handlerand class TwitterHandler extends Handler,并假设,我需要创建MyHandler,从他们两个继承。

在愚蠢的片刻之后,当我认为不使用可怕的“委托模式”是不可能的时,我找到了一个解决方案:

trait SentryTrait extends SentryHandler
class MyHandler extends TwitterHandler with SentryTrait
Run Code Online (Sandbox Code Playgroud)

现在,这让我思考:拥有“特质”概念的目的是什么?如果这个想法是强制您可以从多个特征继承,但只能从一个类继承,那么绕过似乎非常容易。听起来class应该是继承的“主要”线(您“扩展具有特征的类”,但这也不是真的:您可以extend将特征带(或不带)一堆其他特征,并且根本没有课。

你不能实例化一个特征,但同样适用于抽象类......

我能想到的唯一真正的区别是特征不能有构造函数参数。但这有什么意义呢?我的意思是,为什么不呢?这样的事情会有什么问题?

class Foo(bar: String, baz: String) extends Bar(bar) with Baz(baz) 
Run Code Online (Sandbox Code Playgroud)

scala traits

5
推荐指数
1
解决办法
1698
查看次数

Scala抽象类

我是scala的新手,我不知道如何调用抽象类来创建所需的对象.任何帮助都会很棒

abstract class Expr{
    case class Number(n:Double) extends Expr
    case class Sum(e1:Expr, e2: Expr) extends Expr
    case class Subtract(e1: Expr, e2: Expr) extends Expr
    case class Divide(e1: Expr, e2: Expr) extends Expr
    case class Abs(e1: Expr) extends Expr
    case class Mod(e1: Expr, e2: Expr) extends Expr
    def eval(e:Expr): Double = e match{
        case Number(n) => n;
        case Sum(e1,e2) => eval(e1) + eval(e2);
    }
}
object main{
    def main(args: Array[String])  {
        val e = Expr();
        println("hello");
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我希望能够创建Expr对象并在其上使用eval.谢谢.

scala

3
推荐指数
1
解决办法
5167
查看次数

Scala中带有构造函数参数的抽象类

我有以下类模型:

sealed abstract class Tile(val coordinate: Int, val isOccupied: Boolean) {
  def isEmpty() : Boolean
  def getPiece() : Option[Piece]
}

case class EmptyTile(coordinate: Int) extends Tile(coordinate, false) {
  override def toString: String = "" +coordinate
  override def isEmpty() = true
  override def getPiece() = None
}

case class OccupiedTile(coordinate: Int, val piece: Piece) extends Tile(coordinate, true) {
  override def toString = piece.toString
  override def isEmpty = false
  override def getPiece = Some(piece)
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Error:(6, 22) overriding value coordinate in …
Run Code Online (Sandbox Code Playgroud)

scala

3
推荐指数
1
解决办法
2585
查看次数

标签 统计

scala ×6

traits ×2

abstract-class ×1

akka ×1