如何覆盖C#中属性的setter方法?

时间:2011-06-17 11:40:05

标签: c# get properties override set

我有一个带有子类的类。超类具有Position属性。当Position属性发生更改时,子类必须执行其他操作,因此我尝试覆盖setter方法并调用超类'setter。

我想我已经让超类setter调用了part,但我无法弄清楚覆盖语法是如何工作的。

这是我最好的尝试: code

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

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

  

不能覆盖继承的成员'superClassName.Position。[gs] et',因为它没有标记为虚拟,抽象或覆盖

以下是错误的屏幕截图: errors

我也尝试在set前面使用override关键字。去除多余的吸气剂无效。

正确的语法是什么?

5 个答案:

答案 0 :(得分:38)

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

public virtual Vector2 Position

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

答案 1 :(得分:7)

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

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

这也正是编译器消息告诉你的:

  

不能覆盖继承的成员'superClassName.Position。[gs] et',因为它没有标记为虚拟,抽象或覆盖

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

答案 2 :(得分:5)

您的基类中的

:添加关键字virtual

答案 3 :(得分:5)

在错误消息中指出了问题:)

您无法首先覆盖非虚拟(或抽象)的成员。

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

public virtual Vector2 Position { ... }

答案 4 :(得分:3)

您无法覆盖未标记为virtualabstract

的成员

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

public virtual Vector2 Position