2011-11-11 40 views
9

xem xét mã này:Làm thế nào để khởi tạo các lớp bên trong trong một bước trong Scala?

class Outer { 
    class Inner 
} 

Trong Java nó sẽ có thể để tạo ra một thể hiện của Inner với:

Outer.Inner inner = new Outer().new Inner(); 

Tôi biết tôi có thể viết những dòng này trong Scala:

val outer = new Outer 
val inner = new outer.Inner 

Nhưng tôi tự hỏi nếu nó có thể thể hiện giống nhau mà không có sự phân công để outer.

Cả

new Outer.new Inner 

new (new Outer).Inner 

không được chấp nhận bởi trình biên dịch.

Có điều gì tôi thiếu không?

Trả lời

22

Trước hết, tôi nghi ngờ rằng việc khởi tạo trong một lần là có ý nghĩa - bạn giống như vứt bỏ trường hợp Outer, không giữ tham chiếu đến nó. Làm cho tôi tự hỏi, nếu bạn không nghĩ đến việc một lớp bên trong tĩnh Java, như

public class Outer() { 
    public static class Inner() {} 
} 

mà trong Scala sẽ dịch để Inner là một lớp bên trong của đồng đối tượng Outer 's:

object Outer { 
    class Inner 
} 

new Outer.Inner 

Nếu bạn thực sự muốn một lớp phụ thuộc bên trong và bạn chỉ muốn cú pháp thuận tiện hơn để khởi tạo nó, bạn có thể thêm đối tượng đồng hành cho nó:

class Outer { 
    object Inner { 
     def apply() = new Inner() 
    } 
    class Inner 
} 

new Outer().Inner() 
+0

Ah mẹo 'áp dụng' rất thú vị. Tôi ít quan tâm đến cú pháp, e. g. nếu điều này thực sự là một cái gì đó không thể trong Scala ... Tôi đoán điều này giống như hạn chế của PHP mà các phần tử mảng cần được chỉ định trước khi sử dụng. – soc

0

Nếu bạn đã lớp tuyên bố như thế này:

class Outer { 
    class Inner 
} 

sau đó bạn cần phải nhanh chóng lớp bên ngoài đầu tiên và sau đó nhanh chóng lớp bên trong như sau:

val outerTest = new Outer() 
val innerTest = new outerTest.Inner() 

bây giờ bạn có thể gọi nội các phương thức lớp sử dụng biến innerTest.

Các vấn đề liên quan