如何在不同的OOP语言中“继承静态字段”?

时间:2013-06-04 12:15:57

标签: oop generics inheritance static static-members

简短的问题

据我所知,大多数OOP语言都不能继承静态字段。 (C ++,Java,C#)
 另一方面,OOP表示你不应该重复代码。

  • 在OOP语言中是否存在常见方式,这会产生类似“静态字段继承”的内容?
  • 您是否知道更简单,语言特有的方法来解决问题?
  • 有没有“集成”的语言? (我的意思是关键字。)

(无论如何,我知道静态字段的基本意图,我只想更深入并避免重复。)

我的具体问题

我想制作一个框架(C#或Java),并使其更容易扩展。因此,我希望有关继承类的约束和信息尽快放入基类。

我知道,每个继承的类必须有一个自己的静态字段。 (我想为每个子类创建一个对象计数器。)
因此,制作类似“静态字段继承”的东西似乎是合乎逻辑的 - 其中子类需要静态字段,而不是基类。 我已经看到了一些棘手的解决方案(例如:在C#中,在C# abstract class static field inheritance中使用了泛型),但我无法相信没有更简单的方法。
如果没有更简单的方法,请解释我应该如何使用泛型在这种情况下我应该如何看待泛型?我应该将哪些问题与他们联系起来?
(在学校我们只学习它“避免代码重复”,静态字段分离并没有强调!在我看来,在这种情况下,泛型同时是类和即时,但我没有发现任何可理解的逻辑为此而采取的方法。)

3 个答案:

答案 0 :(得分:2)

@Pezo,你误解了静态字段和泛型 静态字段不可继承,因为它们可以在没有实例的情况下访问,并且利用继承的概念仅适用于对象,而不适用于类。

除非您具有从给定基类派生的类的实例,否则不能使用该基类的继承[非静态]字段。但是你总是可以使用任何类的静态字段,无论你是否拥有它的实例,或者是其他任何实例。它们可以通过类的每个实例访问,也可以在没有任何类的任何实例的情况下访问。

对于泛型,泛型和静态字段是不同的主题,几乎没有共同之处。泛型允许您为非类型特定的类(或方法)编写定义或模式,以便稍后可以通过指定要使用的类型来创建实际的具体类。它可以包含静态和非静态字段,属性和方法与on-generic can相同。

答案 1 :(得分:2)

你试图滥用一个简单的机制(静态字段)来处理更复杂的事情。不要这样做。看起来你已经习惯于使用静态字段为每个后代类保存一些类似单身的信息,同时以某种方式统一对它的访问,但这是一种完全错误的方法。

忘记静态字段,并构建一个单独的工具来保存每个类所需的信息。它本质上可以是某个地方的Dictionary<Type, Something>静态字段,或者更复杂的东西。主要取决于您的用例。然后你会看到你不会重复自己,并获得更多好的功能。

您还应该阅读有关Inversion of ControlDependency Injection的内容。您可能已经成功地通过许多IoC框架(例如NinjectStructure Map解决了这个问题)来解决您想要实现的目标。

旁注:考虑找一个合适的框架,而不是建立自己的框架。

答案 2 :(得分:0)

  

OOP语言中是否有一种通用的方式,使得   “静态字段继承”?

否。