2008-10-18 39 views
5

Tôi muốn lấy được một lớp từ Predicate < IMyInterface>, nhưng nó xuất hiện như thể Predicate <> được niêm phong. Trong trường hợp của tôi, tôi muốn trả về kết quả ngược (!) Của hàm được chỉ định. Tôi có những cách khác để hoàn thành mục tiêu. Câu hỏi của tôi là những gì các nhà thiết kế MS đã suy nghĩ khi quyết định đóng dấu Predicate <>?Tại sao là <> niêm phong?

Nếu không có nhiều suy nghĩ tôi đã đưa ra: (a) đơn giản hóa thử nghiệm của họ, chỉ cần một thời gian vs thương mại chi phí đi (b) "không tốt" có thể đến từ bắt nguồn từ Predicate <>

Những gì bạn làm nghĩ sao?

Cập nhật: Có n biến vị ngữ được thêm động vào danh sách các Predicates trong giai đoạn khởi tạo. Mỗi loại trừ lẫn nhau (nếu Abc được thêm vào, NotAbc sẽ không được thêm vào). Tôi đã quan sát một mẫu trông giống như:

bool Happy(IMyInterface I) {...} 
bool NotHappy(IMyInterface I) { return !Happy(I); } 
bool Hungry(IMyInterface I) {...} 
bool NotHungry(IMyInterface I) { return !Hungry(I); } 
bool Busy(IMyInterface I) {...} 
bool NotBusy(IMyInterface I) { return !Busy(I); } 
bool Smart(IMyInterface I) {...} 
bool NotSmart(IMyInterface I) {...} //Not simply !Smart 

Không phải là tôi không thể giải quyết được vấn đề, tôi tự hỏi tại sao tôi không thể giải quyết nó theo một cách nhất định.

+0

Khi bạn nói "đảo ngược", tôi không chắc bạn muốn nói gì. Đối với tôi, nghịch đảo của hàm từ A đến B là hàm từ B đến A. Tôi nghĩ rằng "phủ định" có thể rõ ràng hơn. Bạn đang tìm kiếm điều gì? –

+0

Tôi xin lỗi, nhưng sau khi bạn cập nhật, tôi chỉ không hiểu câu hỏi là gì: bạn có hỏi làm thế nào để có danh sách đại biểu và cho những người không tồn tại - bạn thêm người được ủy quyền không? –

Trả lời

4

Predicate là đại biểu. Bạn không thể kế thừa từ một loại đại biểu. Nếu bạn muốn để có được những giá trị đảo ngược, sử dụng như sau:

Predicate<T> p; 
Predicate<T> inverted = t => !p(t); 
19

Predicate<T> là một loại đại biểu. Bạn không bao giờ có thể lấy được từ các đại biểu.

Thành thật mà nói, nó không giống như thừa kế thực sự là thích hợp ở đây anyway - chỉ cần viết một phương pháp mà trả về một nghịch đảo của bản gốc. Nó đơn giản như thế này:

public static Predicate<T> Invert<T>(Predicate<T> original) 
{ 
    return t => !original(t); 
} 
2

Chức năng của đại biểu là xử lý danh sách các loại phương pháp an toàn. C# nhà thiết kế đã quyết định rằng không có gì để thêm vào chức năng này và không có lý do để thay đổi hành vi cho các đại biểu.

Vì vậy, Jon đúng, kế thừa không phù hợp ở đây.

Đại biểu có thể trỏ đến danh sách các phương pháp. Chúng tôi thêm vào danh sách này với toán tử + = hoặc với Delegate.Combine. Nếu chữ ký của phương thức không bị vô hiệu thì kết quả của phương thức được gọi cuối cùng được trả về (nếu một lần gọi chính xác).

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