Tôi hiện đang triển khai một khuôn khổ Spec trong F # và tôi muốn ẩn các phương thức Equals, GetHashCode vv trên loại should
của mình, để API không bị lộn xộn với các loại này.Làm cách nào để ẩn các phương thức trong F #?
Tôi biết trong C# nó được thực hiện bằng cách làm cho lớp thực hiện một giao diện như thế này:
using System;
using System.ComponentModel;
public interface IFluentInterface
{
[EditorBrowsable(EditorBrowsableState.Never)]
bool Equals(object other);
[EditorBrowsable(EditorBrowsableState.Never)]
string ToString();
[EditorBrowsable(EditorBrowsableState.Never)]
int GetHashCode();
[EditorBrowsable(EditorBrowsableState.Never)]
Type GetType();
}
tôi đã cố gắng làm điều tương tự trong F #:
type IFluentInterface = interface
[<EditorBrowsable(EditorBrowsableState.Never)>]
abstract Equals : (obj) -> bool
[<EditorBrowsable(EditorBrowsableState.Never)>]
abstract ToString: unit -> string
[<EditorBrowsable(EditorBrowsableState.Never)>]
abstract GetHashCode: unit -> int
[<EditorBrowsable(EditorBrowsableState.Never)>]
abstract GetType : unit -> Type
end
thực hiện nó trong loại của tôi:
interface IFluentInterface with
member x.Equals(other) = x.Equals(other)
member x.ToString() = x.ToString()
member x.GetHashCode() = x.GetHashCode()
member x.GetType() = x.GetType()
nhưng không thành công.
Tôi cũng đã cố gắng ghi đè các phương thức trong loại của tôi và thêm thuộc tính theo cách đó, nhưng điều đó cũng không thực hiện được.
Vì vậy, câu hỏi vẫn còn, làm cách nào tôi có thể xóa API của mình?
Edit:
Nhờ sự giúp đỡ (xem dưới đây) tôi đã có thể giải quyết vấn đề của tôi.
Tóm lại, .Equals
và .GetHashCode
có thể bị ẩn qua [<NoEquality>]
[<NoComparison>]
nhưng điều đó cũng sẽ thay đổi ngữ nghĩa.
Ẩn thông qua thuộc tính EditorBrowsable không hoạt động.
Cách duy nhất để có API sạch và vẫn có khả năng quá tải phương pháp là làm cho các thành viên phương pháp này tĩnh.
Lớp kết quả có thể được tìm thấy bằng cách duyệt bên trong dự án của tôi FSharpSpec.
Loại trong câu hỏi có thể được tìm thấy here.
Nhờ mọi người giúp tôi giải quyết vấn đề này.
Chúc mừng ...
Tôi sẽ xem xét điều đó, tôi giả định cách tiếp cận này cũng sẽ cho phép tôi quá tải các phương pháp? - Một lưu ý khác, tôi rất thích màn hình của bạn trên F #. –
Cảm ơn! Thật không may, các hàm được khai báo bằng cách sử dụng 'let' không thể bị quá tải. Quá tải chỉ được hỗ trợ cho các khai báo 'member'. Xem các câu hỏi SO khác về quá tải trong F # - ví dụ: http://stackoverflow.com/questions/2260939/f-overloading-functions –
Trong trường hợp đó, tôi cần phải sử dụng một loại, vì tôi phụ thuộc rất nhiều vào khả năng quá tải phương pháp, bạn có thể tưởng tượng rằng một should.contain (thực tế, dự kiến) cần phải được thực hiện khác nhau cho chuỗi hơn cho chuỗi ví dụ. Có thể quá tải thành viên tĩnh không? Rõ ràng, nếu tôi sẽ làm cho lớp Assertion của tôi và các thành viên của nó tĩnh, nó sẽ không hiển thị bất kỳ phương thức .ToString() ... nào. –