2012-02-19 28 views
16

Tôi tự hỏi ngữ nghĩa của việc sử dụng từ khóa abstract kết hợp với một trait là gì.Ngữ nghĩa của các đặc điểm trừu tượng trong Scala

Nếu đặc điểm không xác định bất kỳ phương pháp trừu tượng, từ khóa abstract không ngăn cản tôi từ việc tạo ra một ví dụ:

scala> abstract trait T 
defined trait T 

scala> new T{} 
res0: java.lang.Object with T = [email protected] 

Mặt khác, nếu các đặc điểm không xác định một phương pháp trừu tượng, tôi không thể tạo một thể hiện (không thực hiện phương pháp này tất nhiên) không có vấn đề nếu từ khóa abstract hiện diện hay không:

scala> abstract trait T { def foo : Unit } 
defined trait T 

scala> new T{} 
<console>:9: error: object creation impossible, since method foo in trait T of type => Unit is not defined 
       new T{} 
       ^

scala> trait T { def foo : Unit } 
defined trait T 

scala> new T{} 
<console>:9: error: object creation impossible, since method foo in trait T of type =>  Unit is not defined 
       new T{} 
       ^

Vì vậy, các từ khóa abstract trước mộtlà gì 210 tốt cho?

+2

Bạn không thể tạo cá thể của một đặc điểm. Khi bạn nói 'new T {}' bạn tạo một đối tượng ẩn danh kết hợp đặc điểm T. – sschaef

Trả lời

28

Nó không có hiệu lực, các đặc điểm được tự động trừu tượng.

Công cụ sửa đổi trừu tượng được sử dụng trong định nghĩa lớp. Đó là dự phòng đối với các đặc điểm và bắt buộc đối với tất cả các lớp khác có số thành viên không đầy đủ.

http://www.scala-lang.org/docu/files/ScalaReference.pdf

1

Bạn sẽ không tạo ra một thể hiện của tính trạng. Không thể khởi tạo các đặc điểm.

Bạn đang tạo một phiên bản của một lớp ẩn danh mở rộng đặc điểm.

Nói chung,

new __t__ 

tương đương với

{ class __anonymous__ extends __t__; new __anonymous__ } 

(nơi __anonymous__ là một tên tươi của một lớp vô danh đó là không thể tiếp cận với các chương trình sử dụng).

Chi tiết này được mô tả chi tiết trong section 6.10 Instance Creation Expressions of the Scala Language Specification. Vì vậy, lý do tại sao bạn có thể tạo một cá thể trong trường hợp đầu tiên, là vì bạn không tạo ra một cá thể của đặc điểm (mà là trừu tượng) mà là một đối tượng (không phải là). Trong trường hợp thứ hai, lý do tại sao bạn không thể tạo một cá thể là nếu bạn thừa kế từ một cái gì đó, cho dù đó là một đặc điểm hay một lớp, bạn cuối cùng phải thực hiện các phương thức trừu tượng của nó ở đâu đó dọc chuỗi thừa kế trong để khởi tạo nó. Trong trường hợp đầu tiên, không có phương pháp trừu tượng để thực hiện.

Bản thân từ khóa abstract không có sự khác biệt: các đặc điểm hoàn toàn trừu tượng, từ khóa thừa.

+4

Tôi nghĩ bạn có nghĩa là anh ấy đang tạo một lớp * ẩn danh *, có đặc điểm như một mixin. –

+0

Xin lỗi, vâng. Một đối tượng là một thể hiện của một lớp ẩn danh là một lớp con của đặc điểm. Phew. –

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