2011-07-03 23 views
5

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:

  1. Đỗ 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ên ExprEval() : Expr<'a> -> 'a trên Expr<'a> .
  2. 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ên ExprEval() : Expr<'a> -> 'a trên Expr<'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?

+2

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.) –

+0

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() '. –

Trả lời

1

Có thể không có câu trả lời dứt khoát cho vấn đề này. Tuy nhiên, trừ khi bạn thực sự tin rằng F # PowerPack đã nhận được thiết kế "sai", tôi sẽ làm theo phong cách của họ vì hai lý do:

  1. Để giữ phong cách phù hợp với những gì các nhà phát triển khác đã làm việc trong F # và các tiện ích chính thức .
  2. Để hiển thị rõ ràng sự khác biệt về các loại trả về của hai phương pháp vì nó là vấn đề.

Tương tự như vậy trong câu trả lời của bạn là Tomas là tốt nhất, nhưng tôi cho rằng bất kỳ nhà phát triển nào sử dụng mã này đều không thể quan tâm nhiều đến thiết kế như bạn có. Tốt nhất để giữ cho phù hợp với phong cách chính thức và rõ ràng trong ý định của bạn.

+0

Điểm tốt David, cảm ơn. Hướng dẫn thiết kế khung cũng thận trọng chống lại sự nhất quán phá vỡ ngay cả đối với thiết kế tốt hơn. Tôi sẽ nói rằng tôi đã tìm thấy các thiết kế PowerPack khó hiểu khi tôi lần đầu tiên gặp nó, và nó làm cho tái thừa nhận thêm rắc rối khi đi giữa các trích dẫn gõ và không phân đoạn. –

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