2011-12-23 2 views
7

Я пишу trait, который должен указать метод clone возвращающей CloneResult, как это:Scala: Определение публичного метода переопределения защищенного метод

trait TraitWithClone extends Cloneable { 
    def clone: CloneResult 
} 

Намерения здесь подкручивать тип возвращаемого из java.lang.Object ' s clone() что-то полезное для этого интерфейса. Однако, когда я пытаюсь скомпилировать это я получаю:

error: overriding method clone in trait View2 of type()CloneResult; method clone in class Object of type()java.lang.Object has weaker access privileges; it should be public; (Note that method clone in trait View2 of type()CloneResult is abstract, and is therefore overridden by concrete method clone in class Object of type()java.lang.Object)

Как я могу потребовать, чтобы реализация быть public, когда Scala не имеют ключевое слово? Я знаю, что могу:

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

... но это похоже на взлом. Какие-либо предложения?

+0

делает определение функции клона переопределения(): CloneResult' работать? –

+0

Нет; это было первое, что я пробовал. –

+0

С круглой скобкой? –

ответ

4

Вот важная часть сообщения об ошибке: «и поэтому переопределяется конкретным методом клонирования в классе Object».

Вы должны обеспечить реализацию метода clone в вашей характеристике. Это не идеально, но это то, что вам нужно сделать с clone - это конкретный метод на Object.

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 = [email protected] 

scala> res2.clone 
res1: Foo = [email protected]