【问题标题】:Scala How to use extends with an anonymous classScala 如何在匿名类中使用扩展
【发布时间】:2014-07-09 15:14:10
【问题描述】:

有没有办法从 Scala 中的匿名类扩展另一个类?我的意思是像

abstract class Salutation {
  def saybye(): String = "Bye"
}

class anotherClass() {
  def dummyFunction() = {

    val hello = new {
      def sayhello(): String = "hello" 
    } extends Salutation

    val hi  = hello.sayhello //hi value is "Hello"
    val bye = hello.saybye   //bye value is "bye"
  }
}

【问题讨论】:

    标签: scala


    【解决方案1】:

    是的,它看起来和 Java 中的差不多:

    abstract class Salutation {
      def saybye: String = "Bye"
    }
    
    val hello = new Salutation {
      def sayhello: String = "hello" 
    }
    
    val hi = hello.sayhello
    val bye = hello.saybye
    

    如果Salutation 是一个抽象类或特征,带有具有相同签名的sayhello 方法,那么您将提供一个实现;否则你将创建一个匿名结构类型的实例:

    hello: Salutation{def sayhello: String}
    

    请注意,对 sayhello 方法的调用涉及反射(因为结构类型在 Scala 中实现的方式),因此如果您大量使用此方法,您可能应该定义一个新的 trait 或类。

    【讨论】:

    • 我一开始并没有指定它,但是Salutation是抽象的...... Salutation没有sayHello,但它有一些我需要并且想要使用的其他功能。有没有另一种方法不创建一个“真正的”类?
    • 是的,我上面给出的代码可以工作,你会得到一个Salutation{def sayhello: String} 的实例,你可以调用这两个方法。
    • 嗯,我应该这样使用它:" val hello: Salutation{def sayhello: String} " 如果是这样,我如何定义 sayhello 的作用以及如何实例化它?
    • hello 的类型(包括sayhello 方法签名)会被推断出来——你不需要写。上面的代码就是实例化类所需的全部内容。
    • 所以我应该有类似的内容:" val hello : Salutation{def sayhello: String} = new Salutation { def sayhello: String = "hello" } " 如果不是,我不明白我在做什么需要写。如果是这样,我会收到此错误:“无法解析构造函数”
    【解决方案2】:

    你需要做的:

    val hello = new Salutation {
        def sayhello(): String = "hello" 
    }
    

    【讨论】:

    • 你领先了我一分钟,但我不认为这种无上下文、仅代码的答案在 Stack Overflow 上通常不是一件好事——尤其是在这种情况下很多可能令人困惑的细微差别。
    • 对不起,我的问题不完整...我改了,现在应该更清楚了:)
    猜你喜欢
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多