2017-08-11 50 views
0

我创建了一个代码在Scala中继承其实际使用继承组成了

任何其他替代办法做到这一点,如果我想用组成。用于该

case class Test(message:msg) 

abstract class MsgValuetype(value: myString) { 
    override def toString = s"${value.value}" 
} 

case class msg(id:String) extends MsgValuetype(myString(id)) 

case class myString(value: String){ 
    override def toString = s"$value" 
} 

下面是我的最后的调用来测试上面的。我只想要传递字符串。请注意实际的类在我的用例中更加复杂。我刚刚试图用简单的方法来获得替代解决方案。

Test(msg("123")) 

更新1

如果我尝试做使MsgValuetype作为其扩展味精情况类的一部分,而不是。

case class Test(message:msg) 

case class MsgValuetype(value: myString) { 
    override def toString = s"${value.value}" 
} 

case class msg(id:String,myType:MsgValuetype) 

case class myString(value: String){ 
    override def toString = s"$value" 
} 

我需要做下面的呼吁进行初始化

Test(msg("123",MsgValuetype(myString("123")))) 

我只是想拨打电话一样

 Test(msg("123")) 
+0

我对你在这里试图完成的事情有点困惑?是否只是想通过传递字符串来初始化'Test'?在这种情况下,最明智的解决方案是在伴随对象中使用重载的“应用”方法。 – puhlen

+0

你想要创作什么?你的例子不足以解释你想要完成的事情。只要有味精包含一个字段MsgValueType而不是扩展它? – puhlen

+0

@ puhlen我已经更新了这个问题,希望通过使用你的代码澄清 – coder25

回答

0

这样的事情,也许?

case class msg(id: String) { val myType = MsgValuetype(myString(id)) } 
+0

没有错误,但我无法打印消息“123”它打印测试(味精(123)) – coder25

+0

也有一个答案与使用应用方法。这是最好的使用方法 – coder25

+0

如果你有时需要'myType'的值不同,使用'apply'会更好。否则,它实际上更糟糕,因为它可以让你用错误的类型值创建'msg'。至于“印刷123”,我不知道你在说什么。此代码不打印任何内容。 – Dima

0

您已在更新完成它的方式是去,像这样定义

case class msg(id:String,myType:MsgValuetype) 

需要添加的唯一的事情味精方式味精同伴对象与重载应用方法

object msg { 
    def apply(id : String): msg = msg(id, MsgValuetype(myString(id))) 
} 

不是你可以创建测试

Test(msg("123")) 
+0

我得到错误重载方法申请需要结果类型 def apply(id:String)= msg (id,MsgValuetype(myString(id))) – coder25

+0

@ coder25对不起,复制错误。由于错误说你只需要添加apply方法的返回类型('def apply(id:String):msg = ...')。我已经更新了我的答案以纠正它。 – puhlen

+0

它现在可以工作,但打印测试(味精(123,123)),而不是123 – coder25