Tôi đang cố thêm các chức năng mới vào các kiểu hiện có (vì vậy tôi có thể tự động đề xuất các chức năng có liên quan cho các loại tôi không kiểm soát, ví dụ Future[Option[A]]
). Tôi đã khám phá cả hai lớp ngầm định và chuyển đổi ngầm để thực hiện điều này và cả hai dường như cung cấp cùng một hành vi.Implicit class vs Implicit chuyển đổi thành đặc điểm
Có sự khác biệt hiệu quả giữa việc sử dụng một lớp ẩn:
case class Foo(a: Int)
implicit class EnrichedFoo(foo: Foo) {
def beep = "boop"
}
Foo(1).beep // "boop"
Và sử dụng một chuyển đổi ngầm:
case class Foo(a: Int)
trait Enriched {
def beep: String
}
implicit def fooToEnriched(foo: Foo) = new Enriched {
def beep = "boop"
}
Foo(1).beep // "boop"
Tôi cho rằng một sự khác biệt ở đây có thể là ví dụ đầu tiên tạo ra một one- tắt lớp thay vì một đặc điểm, nhưng tôi có thể dễ dàng điều chỉnh lớp ẩn để mở rộng đặc điểm trừu tượng, ví dụ:
case class Foo(a: Int)
trait Enriched {
def beep: String
}
implicit class EnrichedFoo(foo: Foo) extends Enriched {
def beep = "boop"
}
Foo(1).beep // "boop"
Một điều nữa cần lưu ý là, khi bạn muốn chuyển đổi hoàn toàn đối tượng kiểu A thành đối tượng thuộc loại B, trong đó B là một 'lớp cuối cùng' *, một' ngầm định' là lựa chọn duy nhất của bạn. – Adowrath