2011-12-23 14 views
7

Sto scrivendo un protetto trait che dovrebbe specificare il metodo di clone restituendo un CloneResult, come così:Scala: Specifica il metodo pubblico prevalente metodo

trait TraitWithClone extends Cloneable { 
    def clone: CloneResult 
} 

L'intento è quello di stringere il tipo di ritorno di java.lang.Object ' s clone() a qualcosa di utile per questa interfaccia. Tuttavia, quando provo a compilare questo, ottengo:

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)

Come posso richiedere che un'implementazione sia public, quando Scala non ha la parola chiave? So che posso fare:

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

... ma sembra un trucco. Eventuali suggerimenti?

+0

Fa 'def clone di override(): CloneResult' lavorare? –

+0

No; questa è stata la prima cosa che ho provato. –

+0

Con la parentesi? –

risposta

4

Ecco la parte importante del messaggio di errore: "ed è quindi sovrascritto dal clone del metodo concreto nell'oggetto classe".

È necessario fornire un'implementazione del metodo clone nella propria caratteristica. Non è l'ideale, ma è quello che devi fare dal clone è un metodo concreto su Object.

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

Anche se, di solito basta fare questo genere di cose nella vostra classe concreta direttamente:

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] 
Problemi correlati