我要做的就是确保确保类Item的子类实现静态方法,我希望在编译时检查这个方法,以避免运行时出错。
带有静态方法的抽象类似乎不起作用:
错误:静态成员不能标记为覆盖、虚拟或抽象
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();
}
}
和接口似乎也不起作用:
错误:客户没有实现接口成员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();
}
是否有一些解决办法让编译器检查继承类是否实现了具有特定签名的静态方法?
发布于 2009-12-15 01:14:38
我为您的场景找到了一个解决办法:
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();
}
}
希望这能帮上忙!
发布于 2009-12-15 00:56:11
发布于 2009-12-15 01:01:34
强迫客户端实现静态方法是没有意义的--静态方法是“不可变的”。(也许有更好的方法来描述它们,但这是我现在所能想到的全部!)
如果需要某种覆盖,我将考虑重新访问设计,可能使用某种形式的单元素和注入的组合。
https://stackoverflow.com/questions/1906053
复制