2009-05-22 29 views
5

Let's assume this class in C#:C#: Inheritance Problem with List <T>

public class LimitedList<T> : List<T> 
{ 
    private int _maxitems = 500; 

    public void Add(T value) /* Adding a new Value to the buffer */ 
    { 
     base.Add(value); 
     TrimData(); /* Delete old data if lenght too long */ 
    } 

    private void TrimData() 
    { 
     int num = Math.Max(0, base.Count - _maxitems); 
     base.RemoveRange(0, num); 
    } 
} 

The compiler gives me this warning in the line "public void Add (T value)":

warning CS0108: 'System.LimitedList.Add (T)' ẩn thành viên được thừa kế 'System.Collections.Generic.List.Add (T)'. Sử dụng từ khóa mới nếu dự định ẩn.

Tôi phải làm gì để tránh cảnh báo này?

Thx 4 sự giúp đỡ của bạn

+1

Đừng quên ghi đè lên hành vi của phần còn lại của giao diện nếu bạn sử dụng kế thừa. Nếu không, bạn chỉ cần tạo một bộ sưu tập Có bộ sưu tập chứ không phải là một bộ sưu tập. –

Trả lời

12

Không - không sử dụng new đây; không cung cấp cho bạn tính đa hình. List<T> không dành cho kế thừa theo cách này; sử dụng Collection<T>override phương thức AddInsertItem.

public class LimitedCollection<T> : Collection<T> 
{ 
    private int _maxitems = 500; 

    protected override void InsertItem(int index, T item) 
    { 
     base.InsertItem(index, item); 
     TrimData(); /* Delete old data if lenght too long */ 
    } 

    private void TrimData() 
    { 
     int num = Math.Max(0, base.Count - _maxitems); 
     while (num > 0) 
     { 
      base.RemoveAt(0); 
      num--; 
     } 
    } 
} 
+0

Đây là giải thích tốt hơn về cách mã hóa đúng cách này. Cảm ơn Marc – CodeLikeBeaker

+0

hơn tôi phải thực hiện toàn bộ giao diện?! –

+0

Không - xem cập nhật –

11

Bạn có thể tránh cảnh báo này bằng cách thêm "mới" vào khai báo.

public new void Add(T value) { 
... 
} 

Tuy nhiên tôi nghĩ bạn có thể đang gặp vấn đề này một chút sai khi sử dụng Thừa kế. Từ quan điểm của tôi, LimitedList không phải là một Danh sách bởi vì nó thể hiện hành vi rất khác vì nó đặt một ràng buộc cứng về lượng dữ liệu trong Danh sách. Tôi nghĩ rằng sẽ tốt hơn nếu không kế thừa từ Danh sách nhưng có một danh sách dưới dạng biến thành viên.

Một lý do khác khiến bạn không thể thỏa mãn hợp đồng của lớp khi được xem là Danh sách. Đoạn mã sau sẽ sử dụng phương thức List`s Add và không phải là LimitedList.

List<int> list = new LimitedList<int>(10); 
for (i = 0; i < 10000; i++) { 
    list.Add(i); 
} 
+0

+1 ... 14 sec –

+1

IMO nó là sai, mặc dù; nó không cung cấp đa hình ... –

+0

Đây không phải là chính xác bạn muốn ghi đè lên không phải mới. –

1

Bạn cần khai báo phương thức 'Thêm' làm phương thức 'mới' (thay thế). Hãy thử điều này:

public class LimitedList<T> : List<T> 
{ 
    private int _maxitems = 500; 

    public new void Add(T value) /* Adding a new Value to the buffer */ 
    { 
     base.Add(value); 
     TrimData(); /* Delete old data if length too long */ 
    } 

    private void TrimData() 
    { 
     int num = Math.Max(0, base.Count - _maxitems); 
     base.RemoveRange(0, num); 
    } 
} 

thông báo sự 'mới' từ khóa trong 'Add (...' khai

Mặc dù, trong trường hợp này, bạn nên tạo lớp generic của riêng bạn thực hiện các giao diện IList. . Hy vọng rằng sẽ giúp.

+0

Xem các câu trả lời khác về đa hình để xem tại sao đây không phải là một ý tưởng tốt. –

0

Giống như những người khác đã nói, bạn cần phải thêm các từ khóa mới. lý do cho điều này là bởi vì trong lớp cơ sở (Danh sách <T>) Add phương pháp chưa được đánh dấu bằng từ khóa "ảo "về cơ bản có nghĩa là" có thể ghi đè ". Do đó, nó phải được đánh dấu là "mới".