2013-01-24 33 views
7

Tôi có một schema của giao diện như sau (C# .NET4)Nested giao diện chung

interface A 
{ 

} 

interface B 
{ 
    List<A> a; 
} 

interface C 
{ 
    List<B> b; 
} 

và tôi thực hiện nó theo cách này:

public interface A 
{ 

} 

public interface B<T> where T : A 
{ 
    List<T> a { get; set; } 
} 

public interface C<T> where T : B 
{ 
    List<T> b { get; set; } // << ERROR: Using the generic type 'B<T>' requires 1 type arguments 
} 

Tôi không biết làm thế nào để tránh lỗi Sử dụng loại chung 'B' yêu cầu 1 loại đối số

+1

Bạn không triển khai bất kỳ giao diện nào ... – Maarten

+0

Tôi đã sử dụng động từ sai :) .. về cơ bản tất cả các asnwers đều tốt, cảm ơn tất cả các bạn – Davide

Trả lời

7

interface B<T> là chung, bạn cần cung cấp một đối số kiểu chính thức cho nó khi khai báo interface C<T>. Nói cách khác, vấn đề hiện tại là bạn không nói cho trình biên dịch loại giao diện B giao diện C "kế thừa" từ đó.

Hai số T s sẽ không nhất thiết phải cùng loại. Họ có thể là cùng loại, như trong

public interface C<T> where T : B<T>, A { ... } 

hoặc họ có thể có hai loại riêng biệt:

public interface C<T, U> where T : B<U> where U : A { ... } 

Các hạn chế đối với các đối số kiểu là tất nhiên chặt chẽ hơn trong trường hợp đầu tiên.

1

C trông giống như loại Generic chung (vì thiếu từ tốt hơn).

Định nghĩa này của C có hoạt động thay thế không?

public interface C<T,U> where T : B<U> where U : A 
{ 
    List<T> b{ get; set; } 
} 
1

kể từ khi loại chung trong giao diện B chỉ có thể là một thể hiện của loại A, trong giao diện C bạn cần phải khai báo T loại B<A>:

public interface A { } 
public interface B<T> where T : A 
{ 
    List<T> a { get; set; } 
} 
public interface C<T> where T : B<A> 
{ 
    List<T> b { get; set; } 
} 
1

này là bởi vì bạn có một <List<T>> nơi TB<T> tại thời điểm bạn có nó như là một List<B> nơi bạn cần phải xác định một loại cho B. Đây là lý do cho lỗi của bạn.

public interface C<T, T2> where T : B<T2> 
    where T2 : A 
{ 
    List<T> b { get; set; } 
} 

Cast T2-A và sau đó bạn sẽ ổn thôi :)

1

bạn có thể thêm giao diện thêm một ở đây như thế

public interface A { } 
public interface B<T> where T : A 
{ 
    List<T> a { get; set; } 
} 
public interface BA : B<A> 
{ 
} 
public interface C<T> where T : BA 
{ 
    List<T> b { get; set; } // << ERROR: Using the generic type 'B<T>' requires 1 type arguments 
} 

nó giải quyết mục đích?

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