scala - 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
}
}
}
解决方案
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
.
推荐阅读
- html - BS4中卡组中断/堆叠时如何更改?
- java - 如何正确安排这 5 分钟的 Spring Batch Job?为什么它立即开始而不是等待设定的时间?
- openxml - OOXML 中的 OpenType 属性
- c++ - 更改由 Boost::Beast 包装的 unix 域套接字的文件权限
- tensorflow - 如何在张量流中使用带有输出的 RandomFlip
- javascript - 谷歌浏览器不显示桌面通知,但声音正常
- api - 使用 Ouath 时 Ebay 购物 Api 无法正常工作
- asp.net-core - 本地主机 404 ASP NET 核心
- vue.js - 构建全局样式并手动包含在 nuxt 中
- c - 如何将字符收集到 C 中的字符串中?