Scala:禁用默认的toString实现

时间:2016-08-16 15:22:16

标签: scala tostring object-model

我想创建一个案例类,如果它与abstract class Identifier { override def toString: String = throw new UnsupportedOperationException } case class AttrIdentifier(name: String) extends Identifier val obj = new NamedIdentifier("foo") // triggers runtime exception s"$obj + bar" "something" + obj 一起使用或至少在隐式字符串转换/插值中使用,将触发编译时错误。到目前为止,我到目前为止最好的是以下内容:

toString

是否有某种方法可以禁用(即标记为私有,隐藏范围等)默认String实现,因此会触发编译时错误?

为什么我这样做

我的最初目标是替换我的应用程序中使用普通Identifier和更高级别实体(自定义类val outputStr = "public function $identifier()" )实现的某些对象(标识符)。以前,使用基于字符串的标识符,如:

Identifier

现在它应该被替换为几个Stringval outputStr = "public function ${privateMemberName(identifier)}()" val outputStr = "public function ${publicMemberName(identifier)}()" val outputStr = "public function ${protectedMemberName(identifier)}()" 函数中的一个(实际上需要在上下文中使用它们),例如:

Identifier

现在我想找到之前使用过这个基于字符串的标识符的所有地方来分析它们,并用这个String - 到 - if (txtAge.Text == "") { message += "<br>Please fill in your Age.</br>"; } if (Convert.ToInt32(txtAge.Text) > 120) { message += "<br>Age cannot be greater than 120</br>"; } if (Convert.ToInt32(txtAge.Text) < 6) { message += "<br>Age cannot be less than 6</br>"; } 函数调用替换简单的字符串插值。

1 个答案:

答案 0 :(得分:3)

您是否考虑过重新定义toString方法以指向另一个抽象方法,而不是尝试禁用 toString?

您可以通过覆盖toString并将其设置为与标识符方法相同来实现此目的,同时保留标识符方法的摘要。 Here is one article that outlines the approach in Java.在Scala中做起来应该更简单。这将强制任何扩展你的特征或抽象类的类以你想要的方式实现toString。