2014-04-19 16 views
14

Có một mã số:Làm thế nào để nhanh chóng đặc điểm mà mở rộng lớp với constructor

class A(name:String) 
trait E extends A 

new E{} //compile error 

là thừa kế đó có thể? Cố gắng để tạo val hoặc def trong cơ thể của lớp vô danh, không giúp đỡ.

+0

không. một đặc điểm Scala không thể mở rộng một lớp, chỉ có các đặc điểm khác. –

+2

trong thực tế, một đặc điểm có thể mở rộng một lớp nhưng không gọi hàm tạo của nó (đó là vấn đề trong trường hợp này). Tôi thậm chí tự hỏi tại sao một bản kê khai tính trạng như vậy lại biên dịch lại. – sschaef

+0

@SteveWaldman @sschaef Các đặc điểm có thể mở rộng các lớp, ngay cả với các đối số hàm tạo. 'class B (name: String) mở rộng A (name) với E' là một ví dụ về cách hoàn toàn tốt để sử dụng một đặc điểm như vậy. – ghik

Trả lời

12

Rất ít giải pháp khả thi:

1) thiết lập giá trị mặc định cho tên trong lớp Một constructor:

class A(name : String = "name") 
trait E extends A 
new E {} // {} is obligatory. trait E is abstract and cannot be instantiated` 

2) pha trộn đặc điểm E để thể hiện của Một:

object inst extends A("name") with E 
// or: 
new A("name") with E 
+0

Scala nên triait mở rộng lớp học, nó vô ích vì nó không thể được instantiated. –

2

A lấy đối số hàm tạo, vì vậy bạn được yêu cầu chuyển nó, ví dụ:

new A("someName") with E 
+0

Vì vậy, tôi không thể khởi tạo E bắt đầu bằng 'mới E' ...? – ka4eli

0

Nếu bạn muốn hạn chế đặc điểm E được trộn lẫn với lớp A chỉ bạn mới có thể sử dụng tự nhập. Tuy nhiên, không có cách nào để xác định biến là E mới với A (...)

class A(val name: String) 

trait E { self: A => 
    def printName() = println(self.name) 
} 

val e = new A("This is A") with E 
e.printName() 
Các vấn đề liên quan