2011-12-23 10 views
7

Piszę chroniony trait że należy określić metodę clone przekazujących CloneResult, a więc:Scala: Określanie metody publiczne nadpisują metody

trait TraitWithClone extends Cloneable { 
    def clone: CloneResult 
} 

Zamiarem jest, aby zaostrzyć typ zwracany z java.lang.Object ' s clone() na coś przydatnego dla tego interfejsu. Jednak przy próbie kompilacji tego, otrzymuję:

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)

Jak mogę wymagać, aby implementacja być public, kiedy Scala nie ma słowa kluczowego? Wiem, że mogę:

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

... ale to wygląda na włamanie. Jakieś sugestie?

+0

Does 'override klon def(): CloneResult' działa? –

+0

Nie; to była pierwsza rzecz, którą próbowałem. –

+0

Z nawiasem? –

Odpowiedz

4

Oto ważna część komunikatu o błędzie: "i dlatego została nadpisana przez konkretny klon metody w klasie Object".

Należy podać implementację metody clone w swojej cechie. To nie jest idealne, ale to jest to, co musisz zrobić, ponieważ clone jest konkretną metodą na Object.

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

Chociaż zazwyczaj po prostu zrobić tego rodzaju rzeczy w swojej klasie betonu bezpośrednio:

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] 
Powiązane problemy