Scala:指定公共方法覆盖受保护的方法

Posted

技术标签:

【中文标题】Scala:指定公共方法覆盖受保护的方法【英文标题】:Scala: Specifying public method overriding protected method 【发布时间】:2012-01-26 23:36:27 【问题描述】:

我正在写一个trait,它应该指定方法clone返回一个CloneResult,如下所示:

trait TraitWithClone extends Cloneable 
  def clone: CloneResult

这里的目的是将java.lang.Objectclone() 的返回类型收紧到对该接口有用的东西。但是,当我尝试编译它时,我得到:

错误:在 ()CloneResult 类型的特征 View2 中覆盖方法克隆; ()java.lang.Object 类型的类 Object 中的方法 clone 具有较弱的访问权限;它应该是公开的; (请注意, ()CloneResult 类型的特征 View2 中的方法 clone 是抽象的, 因此被 ()java.lang.Object) 类 Object 中的具体方法 clone 覆盖

当 Scala 没有关键字时,我如何要求实现为 public?我知道我能做到:

trait TraitWithClone extends Cloneable 
  override def clone = cloneImpl
  protected def cloneImpl: CloneResult

...但这似乎是一个黑客行为。有什么建议吗?

【问题讨论】:

override def clone(): CloneResult 工作吗? 否;这是我尝试的第一件事。 回去试了一下,没有豆子。 【参考方案1】:

这是错误消息的重要部分:“因此被 Object 类中的具体方法克隆覆盖”。

您应该在您的 trait 中提供 clone 方法的实现。这并不理想,但这是你必须要做的,因为cloneObject 上的具体方法。

trait TraitWithClone extends Cloneable 
  override def clone: CloneResult = throw new CloneNotSupportedException

虽然,通常你只是直接在你的具体类中做这种事情:

class Foo extends Cloneable 
  override def clone: Foo = super.clone.asInstanceOf[Foo]


scala> new Foo
res0: Foo = Foo@28cc5c6c

scala> res2.clone
res1: Foo = Foo@7ca9bd

【讨论】:

以上是关于Scala:指定公共方法覆盖受保护的方法的主要内容,如果未能解决你的问题,请参考以下文章

公共与受保护

如何在 Mockery 中为受保护的属性存根公共设置方法

“私有”、“公共”和“受保护的方法”之间有啥区别?

通过公共方法访问受保护的属性

打字稿:使父类中的公共方法成为派生类中的私有/受保护方法

R8 在没有 -allowaccessmodification 标志的情况下将抽象类的“受保护”方法更改为“公共”