【发布时间】:2012-10-11 21:38:04
【问题描述】:
每当我阅读 RE 这个问题或类似的静态继承主题时,回复通常是不支持这(我们知道),并且给出的原因是因为这是一个糟糕的设计,并且可能存在更好的方法来做到这一点。我很想找到一种更好的方法,所以我愿意接受所有建议 - 这就是我想要做的。
我有一个没有实例数据的类。所有方法都是静态的。我们称之为class BaseStatic。我现在想要一个新的静态类(当然有几个,但我们坚持一个),它继承自这个静态类并添加一些新的静态方法,我们称之为SubStatic。
我希望消费者能够写的是:
SubStatic.MethodFromSub();
还有
SubStatic.MethodFromBase();
我知道我也可以写:
BaseStatic.MethodFromBase()
明确地但是消费者必须知道哪个类实现了哪些方法。我不能通过继承来做到这一点,因为我不能从另一个静态类继承一个静态类。那么有什么更好的方法呢?
现在,我知道我可以将这些类作为实例类,并且我可以将所有方法定义为静态 - 这将给我上面描述的行为,但会导致其他问题,即:
当我这样做时:
SubStatic.MethodFromBase()SubStatic静态构造函数未被调用,因为该方法在父静态类中运行(调用父静态构造函数)如果一个静态父方法需要调用另一个子类可以覆盖的方法,我需要子类中的一个虚拟静态方法。我知道我不能拥有。
显然设计如此糟糕 - 谁能帮我重做它?我知道我可以使用实例继承并正确使用虚拟方法(我已经以这种方式工作)但是客户端代码总是必须创建一个实例(或者我想是一些单例)。
【问题讨论】:
-
您可以使用单例设计模式来创建实例并将它们返回给用户。这不能帮助您解决问题吗?
-
是的 - 但是我仍然在创建一个实例,不是吗?另外,消费者必须写:SomeClass.Instance.SomeMethod(),对吧?
-
是的,您必须创建实例,但只需创建一次,然后您就可以使用延迟加载模式缓存它们。这是您可以继承的唯一方法。此外,这将导致更灵活的代码。
-
是否有必要只运行该特定类的 cctor(使用限定符而不是基础的那个)?或者如果所有加载的实现的 cctors 都运行就可以了吗?
-
我可以用任何一种方式工作......
标签: c# inheritance static virtual