2012-03-22 35 views
19

Có một cấu trúc trong C# cho phép bạn tạo một lớp ẩn danh thực hiện một giao diện, giống như trong Java?Giao diện triển khai lớp ẩn danh trong C#?

+0

liên quan http://stackoverflow.com/questions/191013/can-ac-sharp-anonymous-class -implement-an-interface – mcabral

+0

Bạn đang bối rối các biểu thức lambda (các hàm ẩn danh) với các lớp ẩn danh. Nó không có ý nghĩa đối với một hàm để thực hiện các giao diện – dtech

Trả lời

25

Như đã nêu, không, điều này là không thể. Tuy nhiên, bạn có thể tạo một lớp thực hiện giao diện mong muốn và chấp nhận một lambda trong hàm tạo của nó để bạn có thể biến một lambda thành một lớp thực hiện giao diện. Ví dụ:

public class LambdaComparer<T> : IEqualityComparer<T> 
{ 
    private readonly Func<T, T, bool> _lambdaComparer; 
    private readonly Func<T, int> _lambdaHash; 

    public LambdaComparer(Func<T, T, bool> lambdaComparer) : 
     this(lambdaComparer, EqualityComparer<T>.Default.GetHashCode) 
    { 
    } 

    public LambdaComparer(Func<T, T, bool> lambdaComparer, 
     Func<T, int> lambdaHash) 
    { 
     if (lambdaComparer == null) 
      throw new ArgumentNullException("lambdaComparer"); 
     if (lambdaHash == null) 
      throw new ArgumentNullException("lambdaHash"); 

     _lambdaComparer = lambdaComparer; 
     _lambdaHash = lambdaHash; 
    } 

    public bool Equals(T x, T y) 
    { 
     return _lambdaComparer(x, y); 
    } 

    public int GetHashCode(T obj) 
    { 
     return _lambdaHash(obj); 
    } 
} 

sử dụng (rõ ràng là không làm gì hữu ích, nhưng bạn sẽ có được ý tưởng)

var list = new List<string>() { "a", "c", "a", "F", "A" }; 
list.Distinct(new LambdaComparer<string>((a,b) => a == b)); 
+2

Ooh, một chút lạ mắt! –

+2

đây là giải pháp tốt nhất cho vấn đề này tôi đã thấy chưa, thiên tài –

+1

giải pháp rất mát mẻ. Hạn chế chính là bạn phải tạo một lớp cơ sở cho mỗi giao diện. Có cách nào đơn giản để làm cho nó chung chung? –

6

No. C# không hỗ trợ các lớp ẩn danh (ngoại trừ các loại ẩn danh không thể xác định phương thức).

2

Không, Biểu thức Lambda không thể triển khai bất kỳ giao diện bổ sung nào so với giao diện đã thực hiện.

Bạn cũng so sánh những điều sai trái. Tôi đoán bạn thực sự có nghĩa là để hỏi nếu các loại vô danh trong C# có thể thực hiện các giao diện. Câu trả lời cho điều đó cũng không.

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