2009-08-28 38 views
6

C#, .net 3.5C# Phương pháp chung trừu tượng

Tôi đang cố gắng tạo lớp cơ sở có phương pháp chung. Các lớp kế thừa từ nó sẽ chỉ định (các) kiểu của phương thức.

Tiền đề của việc này là để tạo các lớp quản lý lọc.

Vì vậy, tôi có:

public abstract class FilterBase { 
    //NEED Help Declaring the Generic method for GetFilter 
    //public abstract IQueryable<T> GetFilter<T>(IQueryable<T> query); 
} 

public class ProjectFilter:FilterBase { 
    public IQueryable<Linq.Project> GetFilter(IQueryable<Linq.Project> query) { 
    //do stuff with query 
    return query; 
    } 
} 

public class ProjectList { 
    public static ProjectList GetList(ProjectFilter filter) { 
    var query = //....Linq code... 

    query = filterCriteria.GetFilter(query); 

    } 

} 

nghĩ rằng nó là một cái gì đó đơn giản, nhưng tôi không thể nhận đúng cú pháp trong FilterBase cho phương pháp trừu tượng GetFilter.

EDIT

Lý tưởng nhất, muốn giữ chỉ phương pháp như chung chung và không phải là lớp. Nếu không thể, vui lòng cho tôi biết ..

Trả lời

15

Làm cho lớp FilterBase chung chung.

public abstract class FilterBase<T> 
{ 
    public abstract IQueryable<T> GetFilter(IQueryable<T> query); 
} 

Điều này sẽ cho phép bạn tạo lớp ProjectFilter của bạn như thế này:

public class ProjectFilter : FilterBase<Linq.Project> 
{ 
    public override IQueryable<Linq.Project> GetFilter(IQueryable<Linq.Project> query) 
    { 
     //do stuff with query 
     return query; 
    } 
} 
+0

hoạt động, tôi có phải làm cho lớp học chung chung không? Tôi không thể giữ nguyên phương pháp chung? Lý do tôi hỏi là có thể có nhiều GetFilter cho cùng một lớp mà có một IQueryable khác nhau hơn 'Linq.Project' –

+1

@B Z: Bạn chỉ có thể làm cho phương thức chung chung, nhưng sau đó nó sẽ phải ở lại chung cho đến khi được gọi. Bạn không thể lấy được từ lớp không chung chung và chỉ định kiểu generic trên phương thức khi bạn thử câu hỏi của bạn. Người gọi sẽ phải cung cấp kiểu cho phương thức trong trường hợp đó. –

+0

@Mark - thx. Có vẻ như là một hạn chế đối với tôi? Bạn có biết nếu có thêm lời giải thích không? Có lẽ trong C# In Depth của Jon Skeet? –

4
public abstract class FilterBase<T> { 
    public abstract IQueryable<T> GetFilter<T>(IQueryable<T> query); 
} 
2

Tất nhiên, bạn có thể có một phương pháp chung chung trừu tượng:

public abstract class FilterBase { 
    public abstract IQueryable<T> GetFilter<T>(IQueryable<T> query); 
} 

Vấn đề là rằng nó không có nghĩa là những gì bạn muốn. Nó có thể được gọi cho bất kỳ T. Đặc biệt, sau đây phải làm việc, kể từ ProjectFilter xuất phát từ FilterBase:

FilterBase fb = new ProjectFilter(...); 
IQueryable<string> query = ...; 
IQueryable<string> filter = fb.GetFilter<string>(query); 

Vì vậy FilterBase không thể chỉ thực hiện GetFilter<Linq.Project>. Cần triển khai GetFilter<string>, GetFilter<int>, v.v.; trong ngắn hạn, GetFilter<T>. Vì vậy, bạn có thể thấy nó không phải là một hạn chế.

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