F#静态覆盖

时间:2016-01-10 17:26:16

标签: inheritance static f# override

我有一个抽象类,有一个抽象成员。 我想将此成员继承到不同的类,并使成员的覆盖为静态。

这样的事情:

[<AbstractClass>]
type Parent() = class
  abstract member Att : int
end;;
type Son() = class
  inherit Parent()
  static override Att = 10
end;;
type Daughter() = class
  inherit Parent()
  static override Att = 20
end;;

替代地

[<AbstractClass>]
type Parent() = class
  static abstract member Att : int
end;;

[<AbstractClass>]
type Parent() = class
  abstract static member Att : int
end;;

然后所有的儿子都会有Att = 10而且所有的女儿都会有Att = 20。 这不起作用。

有没有办法让这项工作?

1 个答案:

答案 0 :(得分:5)

这不可能来自对象模型的定义 - 静态方法也不能在C#和任何其他对象语言中被覆盖。

这是提到的,例如这里也是(对于Java,但这是面向对象编程的一般性):

Why cannot we override static method in the derived class

  

覆盖取决于类的实例。多态性是您可以对类进行子类化,并且实现这些子类的对象将对超类中定义的那些方法具有不同的行为(并在子类中重写)。静态方法不属于类的实例,因此该概念不适用。

特别是对于抽象类,这没有意义 - 你要么在派生类上调用方法(这意味着它不需要在超类中定义),要么在超类上调用(这意味着它没有' (需要是抽象的),或者在一个实例上(这意味着它不能是静态的)。