2009-12-15 39 views
17

Tất cả tôi muốn làm là đảm bảo rằng lớp con của lớp mục thực hiện một tĩnh phương pháp và tôi muốn điều này phải được kiểm tra tại thời gian biên dịch để tránh các lỗi runtime.Làm thế nào tôi có thể buộc các lớp kế thừa để thực hiện một phương thức tĩnh trong C#?

lớp trừu tượng với phương pháp tĩnh dường như không làm việc:

ERROR: A static member cannot be marked as override, virtual, or abstract

public abstract class Item 
{ 
    public static abstract Item GetHistoricalItem(int id, DateTime pastDateTime); 
} 

public class Customer : Item 
{ 
    public static override Customer GetHistoricalItem(int id, DateTime pastDateTime) 
    { 
     return new Customer(); 
    } 
} 

public class Address : Item 
{ 
    public static override Address GetHistoricalItem(int id, DateTime pastDateTime) 
    { 
     return new Address(); 
    } 
} 

và giao diện không có vẻ làm việc một trong hai:

ERROR: Customer does not implement interface member GetHistoricalItem()

public class Customer : Item, HistoricalItem 
{ 
    public static Customer GetHistoricalItem(int id, DateTime pastDateTime) 
    { 
     return new Customer(); 
    } 
} 

public class Address : Item, HistoricalItem 
{ 
    public static Address GetHistoricalItem(int id, DateTime pastDateTime) 
    { 
     return new Address(); 
    } 
} 

interface HistoricalItem 
{ 
    Item GetHistoricalItem(); 
} 

Có một số wo không rkaround cho điều này để có kiểm tra trình biên dịch nếu kế thừa các lớp học thực hiện một phương pháp tĩnh với một chữ ký nhất định hay không?

Trả lời

0

Theo định nghĩa, một phương pháp tĩnh không thể được triển khai trong các lớp dẫn xuất.

3

Nó không có ý nghĩa để buộc khách hàng để thực hiện một phương pháp tĩnh - Phương pháp tĩnh là "không thay đổi." (Có lẽ là cách tốt hơn để mô tả chúng nhưng đó là tất cả tâm trí của tôi có thể xuất hiện ngay bây giờ!)

Nếu cần phải ghi đè một số loại, tôi sẽ xem xét lại thiết kế, có thể sử dụng một dạng kết hợp nào đó của người độc thân và tiêm.

+0

Tôi có một Hạng mục mà nhiều đối tượng khác nhau kế thừa, ví dụ: Khách hàng, địa chỉ, vv Và nếu một lớp là loại Item, thì tôi muốn có thể gọi một phương thức factory trên nó được gọi là GetHistoricalItem(). Vì vậy, tôi muốn có thể nói địa chỉ Address = Address.GetHistoricalItem (...). Và tôi muốn biết tại thời điểm biên dịch rằng tất cả các lớp học của tôi mà kế thừa mục làm điều này. Nó chỉ nên làm việc giống như cách nó làm cho các phương thức ví dụ. –

+0

@EdwardTanguay đây là từ một thời gian dài trước đây, nhưng bạn tốt hơn hết nên tạo một số loại lớp Lịch sử (ví dụ) có chứa các phương thức bình thường để lấy địa chỉ từ đó. Đăng ký sẽ là một tên tốt cho ví dụ. –

19

Có một workaround tôi đã tìm ra cho kịch bản của bạn:

public class Customer : Reference<Customer>, IHistoricalItem 
{ 
} 

public class Address : Reference<Address>, IHistoricalItem 
{ 
} 

public interface IHistoricalItem 
{ 
} 

public class Reference<T> where T : IHistoricalItem, new() 
{ 
    public static T GetHistoricItem(int id, DateTime pastDateTime) 
    { 
     return new T(); 
    } 
} 

Hope this helps !!

+0

+1 Đó là cách giải quyết vấn đề của OP. – Groo

+2

Nó không tạo ra bất kỳ lỗi nào ngay cả khi Khách hàng/Địa chỉ không triển khai chức năng GetHistoricItem. Tui bỏ lỡ điều gì vậy? – Bill

+0

@Yongke Bill Yu: tại sao bạn nghĩ nó nên? – jwaliszko

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