【问题标题】:How do I override the setter method of a property in C#?如何在 C# 中覆盖属性的 setter 方法?
【发布时间】:2011-06-17 11:40:05
【问题描述】:

我有一个带有子类的类。超类有一个Position 属性。当Position 属性发生变化时,子类必须执行额外的操作,所以我试图重写setter 方法并调用超类的setter。

我想我的超类 setter 调用部分已关闭,但我无法弄清楚覆盖语法在这里是如何工作的。

这是我最好的尝试:

getter 只是为了证明概念——假设我也想覆盖它?

getter 和 setter 给我这种形式的错误:

无法覆盖继承的成员“superClassName.Position.[gs]et”,因为它没有标记为虚拟、抽象或覆盖

这里也是错误的截屏:

我还尝试在 set 前面使用 override 关键字。去掉多余的吸气剂没有效果。

正确的语法是什么?

【问题讨论】:

  • 另请注意,您正在覆盖 getter,如果代码的目的是使用基类 Position 并在设置值时调用 SnapBodyToPos(),您还必须更改“get”以“return base.Position”而不是“return pos”

标签: c# get properties overriding set


【解决方案1】:

覆盖很好。但是,正如错误消息所述,您需要将基类中的属性标记为虚拟才能覆盖它:

public virtual Vector2 Position

与 Java 不同,类成员在 C# 中默认不是虚拟的。如果你不能改变基类,那你就不走运了。

【讨论】:

  • 是的,我就是这样。我正在制作 C#,但在思考 Java。谢谢!
【解决方案2】:

您的Position 属性在基类中不是虚拟的,因此您不能覆盖它。如果你把它变成虚拟的,你应该可以覆盖它。

在没有另一个的情况下覆盖一个有点有点混乱 - 这不是我经常做的那种事情,所以我不得不玩弄它以确保发生了什么,但 首先 要做的就是改变基类属性...

这也正是编译器消息告诉您的内容:

无法覆盖继承的成员“superClassName.Position.[gs]et”,因为它没有标记为虚拟、抽象或覆盖

它告诉你一些关于基类属性的信息——所以你需要改变它才能覆盖它。编译器消息可以提供帮助 - 请密切注意它们!

【讨论】:

    【解决方案3】:

    错误信息中已向您指出问题:)

    您一开始就不能覆盖不是虚拟(或抽象)的成员。

    您的超类需要在属性定义中包含virtual

    public virtual Vector2 Position { ... }
    

    【讨论】:

      【解决方案4】:

      在你的基类中:添加关键字virtual

      【讨论】:

        【解决方案5】:

        您不能覆盖未标记为 virtualabstract 的成员

        将超类中的Vector2 属性标记为virtual

        public virtual Vector2 Position
        

        【讨论】:

          猜你喜欢
          • 2014-04-08
          • 1970-01-01
          • 1970-01-01
          • 2018-11-08
          • 2014-06-10
          • 2019-02-28
          • 1970-01-01
          • 2019-07-25
          • 1970-01-01
          相关资源
          最近更新 更多