2017-01-25 12 views
6

Tôi đang tìm hiểu về lớp trừu tượng, liên kết này là rất nhiều thông tinLớp trừu tượng Scala, tự làm gì?

scala generic method overriding

abstract class Foo[T] { self:T => 
    def bar1(f:T):Boolean 
    def bar2(f:T):T 
} 

class FooImpl extends Foo[FooImpl]{ 
    override def bar1(f:FooImpl) = true 
    override def bar2(f:FooImpl) = f 
} 

gì tự: T là viết tắt của T là tham số lớp như tôi hiểu không?.

+4

Đó là loại tự thực thi rằng bất kỳ loại phụ nào của 'Foo' phải là tham số kiểu được đặt cho' Foo' – cchantep

Trả lời

3

Như @cchantep nêu trong bình luận của ông, self : T trong trường hợp này là một loại tự chú thích về cơ bản nói rằng một thể hiện của Foo[T] nhu cầu cũng cư xử như một T. Bạn có thể thấy đó thực sự là trường hợp trong FooImpl, dưới dạng FooImpl <: Foo.

Bạn có thể tìm hiểu thêm về chú thích tự nhập here, here hoặc here. Chú ý, hầu hết thời gian, bạn sẽ thấy nó được sử dụng trong ngữ cảnh Dependency Injection và Cake Pattern.

thú vị nhất từ ​​the second link là tôi nghĩ rằng phần đầu tiên:

Nói cách khác, là những gì các điểm để làm điều này:

trait A
trait B { this: A => }

khi bạn có thể thay vì chỉ làm điều này:

trait A
trait B extends A

Tại sao bạn nên sử dụng [cú pháp này]?

[...] câu trả lời thường đi xuống "B yêu cầu A" (chú thích) so với "B là A" (thừa kế) và rằng trước đây là tốt hơn cho quản lý phụ thuộc.

Cuối cùng, và chỉ để làm rõ, lưu ý rằng từ self là không cần thiết chút nào. Đây có thể là bất kỳ tên biến hợp lệ nào, nhưng self hoặc this hầu như là một quy ước. Tức là, bạn có thể làm:

trait A 
trait B { myVar: A => } 

nhưng điều đó sẽ ít phổ biến hơn.

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