2015-03-31 15 views
5

vợt của chỉ một phần mô tả những gì augmentpubment làm: augment làm cho một phương pháp mà thực thi sau khi phiên bản của lớp cha của phương pháp đó, trong khi pubment làm cho một phương pháp mà mặc nhiên sẽ có augment tài sản nếu nó được định nghĩa trong một lớp trẻ.Trong hệ thống lớp học của Racket, những gì làm tăng thêm, overment, augride, vv làm gì? tài liệu

Tài liệu nói hoàn toàn không có gì về số overmentaugride và tôi không thể đoán được họ sẽ làm gì dựa trên tên của họ. Chúng là gì, và sự khác biệt giữa chúng là gì?

Trả lời

7

Gia đình tương đối lớn của các hàm kế thừa cho hệ thống lớp học của vợt là, như bạn mô tả, một chút khó hiểu, và tên hơi cutesy của họ không phải luôn luôn giúp đỡ.

Để hiểu điều này, Racket cung cấp hai cơ chế riêng biệt để thừa kế phương thức.

  • public phương pháp tương ứng với các ý tưởng cổ điển của phương pháp nào trong các mô hình OO khác. Các phương thức được khai báo với public có thể bị ghi đè trong các lớp con, trừ khi chúng được khai báo final, trong trường hợp này chúng không thể.
  • pubment phương pháp tương tự, nhưng họ không thể ghi đè , chỉ tăng cường. Augmenting một phương thức tương tự như overriding nó, nhưng công văn gọi thực hiện của superclass thay vì subclass's.

Để làm rõ sự khác biệt giữa trọng và tăng thêm, khi một phương pháp ghi đè được gọi là, việc thực hiện trọng được thực thi, mà có thể tùy cuộc gọi thực hiện của lớp cha qua inherit/super. Ngược lại, trong một phương thức tăng cường, việc thực hiện của lớp cha nhận được điều khiển, và nó có thể tùy chọn gọi triển khai của lớp con thông qua inner.

Bây giờ, chúng tôi cũng đang cung cấp public-final, override-finalaugment-final. Đây là khá đơn giản. Khai báo một phương thức với public-final có nghĩa là nó không thể được tăng cường hay ghi đè. Sử dụng override-final ghi đè phương thức công khai của một siêu lớp, nhưng nó không cho phép bất kỳ thêm ghi đè nào khác. Cuối cùng, augment-final tương tự, nhưng đối với các phương pháp được khai báo với pubment, không phải public.

Vậy thì, về hai giống lai kỳ lạ, overmentaugride thì sao?

  • overment thể được sử dụng để thực hiện các phương pháp ban đầu được xác định với public. Điều này "chuyển đổi" chúng thành các phương thức tăng thêm thay vì các phương thức ghi đè cho tất cả các lớp con của lớp.
  • augride đi theo hướng ngược lại.Nó chuyển đổi một phương thức có thể tăng lên thành một phương thức có thể ghi đè, nhưng việc thực hiện ghi đè chỉ thay thế tăng thêm, chứ không phải thay đổi ban đầu.

Để tóm tắt:

  • public, pubmentpublic-final tất cả tuyên bố phương pháp mà không tồn tại trong một lớp cha.
  • Sau đó, chúng tôi có một gia đình của các hình thức cho việc mở rộng phương pháp lớp cha:
    • overrideaugment mở rộng phương pháp khai báo với publicpubment, tương ứng, bằng cách sử dụng các hành vi có liên quan.
    • override-finalaugment-final làm tương tự như các đối tác phi chính thức của họ, nhưng ngăn chặn sự trọng hoặc tăng thêm.
    • overmentaugride chuyển đổi các phương pháp có thể ghi đè thành các phương pháp có thể sửa đổi và ngược lại.

Đối với người khác, giải thích đầy đủ hơn, bạn có thể quan tâm đến việc xem xét tại the paper from which Racket's model was derived, đó là khá dễ đọc và bao gồm một số sơ đồ hữu ích.

+0

Thật đáng tiếc là hệ thống lớp mặc định của Racket hỗ trợ các phương thức cuối cùng. Tôi chắc chắn tôi sẽ phải viết một số cách giải quyết khó chịu cho một số phương pháp cuối cùng tại một thời điểm nào đó trong tương lai. –

+1

@ ThrowawayAccount3Million Có phương pháp cuối cùng là một công cụ quan trọng để thực thi đóng gói. Nó không nên bị lạm dụng, và tôi không nghĩ rằng các thư viện Racket sử dụng nó một cách nhẹ nhàng. –

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