Tôi vừa đọc xong phần về các thành viên mở rộng trong Hướng dẫn Thiết kế Khung 2, bởi Krzysztof Cwalina và Brad Abrams, và không tìm thấy một ví dụ cho việc này. Câu hỏi của tôi liên quan đến một lớp siêu và phụ trong thư viện F #, nhưng tôi hy vọng câu trả lời có liên quan đến tất cả các ngôn ngữ .NET.Hướng dẫn thiết kế phương pháp mở rộng: tên giống như phương thức sẽ giống nhau đối với lớp phụ và siêu hạng?
F # có hai loại, loại siêu Expr
và loại phụ Expr<'a>
trong đó loại thứ hai chỉ là trình bao bọc cho phiên bản đã nhập trước đó. Đây là các loại được sử dụng cho các biểu thức báo giá.
Nếu tôi muốn xác định phương pháp mở rộng trên các loại để đánh giá họ, đó sẽ là một thiết kế tốt hơn:
- Đỗ như F # PowerPack làm và phương pháp xác định với tên gọi khác nhau
EvalUntyped() : Expr -> obj
trênExpr
vàEval() : Expr<'a> -> 'a
trênExpr<'a>
. - Làm điều gì đó gần hơn với những gì bạn sẽ làm nếu bạn sở hữu các loại và sử dụng cùng tên (trong đó phương pháp siêu loại có thể được coi là ảo và phương pháp trên loại phụ có thể được coi là ghi đè phương pháp siêu ảo). tức là
Eval() : Expr -> obj
trênExpr
vàEval() : Expr<'a> -> 'a
trênExpr<'a>
.
Tùy chọn thứ hai có vẻ đúng hơn với tôi, nhưng tôi muốn làm theo bất kỳ hướng dẫn thiết kế nào có thể có: có bất kỳ quyền ưu tiên nào cho điều này (giả sử chúng có "sai" trong PowerPack) không?
Tôi không biết các đề xuất là gì. Một điều cần lưu ý là nếu 'Eval' là một phương thức ảo chuẩn, thì kiểu bắt nguồn sẽ không thể thay đổi kiểu của nó. (Đối số sẽ phải là 'Expr'. Thay đổi kết quả từ' obj' thành ''a' cũng không được phép, nhưng nó sẽ là kiểu âm thanh.) –
Ah, điểm tốt Tomas. Có lẽ một sự tương tự tốt hơn là 'IEnumerable.GetEnumerator() 'và' IEnumerable <'a> .GetEnumerator() '. –