2009-12-15 136 views
17

所有我想做的是确保该类项目的子类实现静态方法,我想这在编译时进行检查,以避免运行时错误。我该如何强制继承类来在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(); 
    } 
} 

和接口似乎并没有工作,要么:

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(); 
} 

有没有为了让编译器检查继承类是否实现了一个带有某个签名的静态方法?

回答

0

按照定义,静态方法不能在派生类中实现。

3

这是没有意义的强制客户端来实现一个静态方法 - 静态方法是“不可改变的”。 (可能有更好的方法来描述它们,但这是我现在所想的所有想法!)

如果需要某种重写,我会考虑重新访问设计,可能使用某种形式的组合单身和注射。

+0

我有一个类的项目,各种对象继承,例如客户,地址等。如果一个类是Item类型,那么我希望能够调用一个名为GetHistoricalItem()的工厂方法。所以我希望能够说Address address = Address.GetHistoricalItem(...)。我想在编译时知道所有继承Item的类都可以做到这一点。它应该像实例方法一样工作。 – 2009-12-15 09:11:34

+0

@EdwardTanguay这是很久以前的事,但你最好创建一些历史类(实例),它包含从中检索地址的常规方法。例如,注册将是一个好名字。 – 2012-11-26 18:27:31

19

有一种变通方法我想通了您的方案:

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(); 
    } 
} 

希望这有助于!

+0

+1这是解决OP问题的方法。 – Groo 2009-12-15 09:19:44

+2

即使客户/地址未实现GetHistoricItem函数,也不会产生任何错误。我错过了什么吗? – Bill 2012-07-24 19:40:27

+0

@Yongke Bill Yu:你认为应该怎么做? – jwaliszko 2012-11-26 15:22:25