【问题标题】:F# static overrideF# 静态覆盖
【发布时间】:2016-01-10 17:26:16
【问题描述】:

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

类似这样的:

[<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。 这不起作用。

有没有办法让它工作?

【问题讨论】:

  • 解决方案是否要求您使用静态?或者该解决方案是否要求一旦创建了儿子 Att=10 并且一旦创建了女儿 Att=20 就不能更改它们?例如只读。
  • Readonly 实际上解决了这个问题。非常感谢。

标签: inheritance static f# overriding


【解决方案1】:

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

这是提到的,例如这里也是(对于 Java,但这对于面向对象编程来说是通用的):

Why cannot we override static method in the derived class

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

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

【讨论】:

  • 我没有意识到这一点。非常感谢。