首页 > 解决方案 > Scala:在通用类后面隐藏两个类

问题描述

我有两个不同的 scala 类,我们可以称之为 ClassA 和 ClassB。

假设我必须运行 doSomething(ClassA) 和 doSomething(ClassB)

我想创建一个可以从 ClassA 或 ClassB 构造的新类 ClassC 并实现函数 doSomething。

我的问题是我对 Scala 构造函数并不十分熟悉(我更像是一名 Java 开发人员),而且我觉得我所做的并不正确。这是我的尝试:

class ClassC(obj:Object,tmp:Integer) {

  def this(classA: ClassA){
    this(classA,0)
  }

  def this(classB: ClassB){
    this(classB,0)
  }

  def doSomething(){
    if(obj.getClass.getName == "ClassA"){
          // do something with obj
    }else if(obj.getClass.getName == "ClassB"){
          // do something with obj
    }
  }
}

标签: scala

解决方案


Normal way to do so would be to create a common trait/abstract class and two classes extending it, one of which can be constructed from ClassA and another from ClassB:

trait TraitC {
  def doSomething(): Unit
}
object TraitC {
  def apply(x: ClassA) = ClassCA(x)
  def apply(x: ClassB) = ClassCB(x)
}

class ClassCA(x: ClassA) extends TraitC {
  def doSomething() = doSomething(x)
}
class ClassCB(x: ClassB) extends TraitC {
  def doSomething() = doSomething(x)
}

Much better than anything using obj.getClass.getName.


推荐阅读