2011-12-23 29 views
7

Tôi đang viết một bảo vệ trait rằng nên xác định các phương pháp clone trả lại một CloneResult, như vậy:Scala: Chỉ định phương pháp nào quan trọng hơn phương pháp

trait TraitWithClone extends Cloneable { 
    def clone: CloneResult 
} 

Mục đích ở đây là để thắt chặt các kiểu trả về của java.lang.Object ' s clone() vào một cái gì đó hữu ích cho giao diện này. Tuy nhiên, khi tôi cố gắng biên dịch này, tôi nhận được:

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)

Làm thế nào tôi có thể yêu cầu một thực hiện được public, khi Scala không có từ khóa? Tôi biết tôi có thể làm:

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

... nhưng điều đó có vẻ giống như hack. Bất kỳ đề xuất?

+0

Liệu 'def bản sao ghi đè(): CloneResult' làm việc? –

+0

Không; đó là điều đầu tiên tôi thử. –

+0

Với dấu ngoặc đơn? –

Trả lời

4

Đây là phần quan trọng của thông báo lỗi: "và do đó được ghi đè bằng phương thức cụ thể trong lớp đối tượng".

Bạn nên cung cấp phương pháp clone trong đặc điểm của mình. Nó không phải lý tưởng, nhưng đó là những gì bạn phải làm từ clone là một phương pháp cụ thể trên Object.

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

Mặc dù, thông thường bạn chỉ cần làm việc này trong lớp bê tông của bạn trực tiếp:

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] 
Các vấn đề liên quan