2010-03-01 72 views
19

tôi đang làm việc trên một lớp trừu tượng mà lớp thực hiện cần phải thực hiện một danh sách các T. Vấn đề là điều này không làm việc:Sử dụng Generics trong lớp trừu tượng

public class AbstractClass 
{ 
    public int Id { get; set; } 
    public int Name { get; set; } 

    public abstract List<T> Items { get; set; } 
} 

public class Container : AbstractClass 
{ 
    public List<Widgets> Items { get; set; } 
} 

Tôi chắc chắn rằng có một câu trả lời rõ ràng mà tôi đang thiếu, và tôi biết rằng tôi có thể xây dựng một kiểu cơ sở trừu tượng để đưa vào danh sách, nhưng khi tôi sử dụng lệnh Linq để xây dựng danh sách, kiểu trừu tượng (ItemBase) không chơi độc đáo với phương thức .ToList(). Là những gì tôi đang cố gắng để làm như vậy độc đáo?

+0

Nó chỉ ra rằng tôi cần phải tìm hiểu để nghiên cứu tốt hơn. Xin lỗi cho tất cả các câu trả lời giống nhau mà không nhận được dấu kiểm. Tôi đã chọn vị trí hàng đầu dựa trên sự hoàn chỉnh của nó và thực tế nó là hàng đầu. – thaBadDawg

+0

Bạn có thực sự muốn 'Mục' trừu tượng không? (tức là ghi đè lên các thuộc tính get hoặc set?) Nếu bạn mở rộng từ 'AbstractClass ' giống như hầu hết mọi người đang đề xuất, 'Container.Các mục' sẽ hoàn toàn là một 'Danh sách ' và bạn thậm chí sẽ không cần ghi đè lên nó. – Tanzelax

+0

Tôi muốn để lại khả năng các phương thức getter và setter bị ghi đè sau này. Về lý thuyết tôi không cần, nhưng trong thực tế, cố gắng hoàn tác sự lộn xộn đó dẫn đến một thế giới bị tổn thương. – thaBadDawg

Trả lời

26

Bạn cần khai báo trên lớp là tốt, phải biết những gì loại T là:

public abstract class AbstractClass<T> 
{ 
    public int Id { get; set; } 
    public int Name { get; set; } 

    public abstract List<T> Items { get; set; } 
} 

public class Container : AbstractClass<Widgets> 
{ 
    public List<Widgets> Items { get; set; } 
} 

Bạn cũng có thể hạn chế những gì T có thể được, như nói nó phải thực hiện IWidgets:

public class AbstractClass<T> where T : IWidgets 
+1

Đừng quên thêm từ khóa 'abstract' vào chính dòng khai báo lớp, không chỉ là thuộc tính. – Nick

+1

Điều này không biên dịch. –

5

Bạn cần phải thực hiện AbstractClass chung

public class AbstractClass<T> { 
    ... 
} 

public class Container : AbstractClass<Widgets> { ... 
} 
1

Yo u cần phải xác định loại trong lớp trừu tượng:

public class AbstractClass<T> 
{ 
    public int Id { get; set; } 
    public int Name { get; set; } 

    public abstract List<T> Items { get; set; } 
} 

public class Container : AbstractClass<Widgets> 
{ 
    public List<Widgets> Items { get; set; } 
} 
2

Bạn cần phải xác định T như vậy

public class AbstractClass<T> 
{ 
    public int Id { get; set; } 
    public int Name { get; set; } 

    public abstract List<T> Items { get; set; } 
} 

public class Container : AbstractClass<Widget> 
{ 
    public List<Widgets> Items { get; set; } 
} 
7
  • Bạn cần phải khai báo kiểu T.
  • Bạn cần phải khai báo AbstractClass lớp trừu tượng.
  • Bạn cần sử dụng từ khóa ghi đè.

Hãy thử điều này:

public class Widgets { } 

public abstract class AbstractClass<T> 
{ 
    public int Id { get; set; } 
    public int Name { get; set; } 

    public abstract List<T> Items { get; set; } 
} 

public class Container : AbstractClass<Widgets> 
{ 
    public override List<Widgets> Items { get; set; } 
} 
+0

+1 để biên dịch mã – Tanzelax

3
  1. Bạn cần phải đánh dấu AbstractClass abstract, bởi vì nó có chứa tài sản trừu tượng

  2. Xác định generic loại trong tờ khai AbstractClass

  3. Thực hiện sở hữu trừu tượng với override

 

public abstract class AbstractClass<T> 
{ 
    public int Id { get; set; } 
    public int Name { get; set; } 

    public abstract List<T> Items { get; set; } 
} 

public class Container : AbstractClass<Widgets> 
{ 
    public override List<Widgets> Items { get; set; } 
} 
 
0

Bạn đang thiếu để xác định từ khóa trừu tượng cho lớp AbstractClass của bạn và cũng có thể bạn cần thêm từ khóa override cho tài sản Items container Class. Tôi đưa ra mã ví dụ mà sẽ chạy cho chắc chắn.

namespace AbstractGeneric 
{ 

public abstract class AbstractClass<T> 
{ 
    public int Id { get; set; } 
    public int Name { get; set; } 

    public abstract List<T> Items { get; set; } 
} 

public class Widgets 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

public class Container : AbstractClass<Widgets> 
{ 
    public override List<Widgets> Items { get; set; } 
    public Container() 
    { 
     Items = new List<Widgets>(); 
    } 

} 


class Program 
{ 
    static void Main(string[] args) 
    { 
     Container c = new Container(); 
     c.Items.Add(new Widgets() { ID = 1, Name = "Sample Widget 1" }); 
     c.Items.Add(new Widgets() { ID = 2, Name = "Sample Widget 2" }); 

     foreach (Widgets item in c.Items) 
     { 
      Console.WriteLine(item.ID + " : " + item.Name); 
     } 

     Console.ReadLine(); 
    } 
} 
} 
Các vấn đề liên quan