【问题标题】:Help With Overriding C# .NET帮助覆盖 C# .NET
【发布时间】:2011-03-30 21:30:53
【问题描述】:

我需要重写 Tabcontrol GetTabRect。

  protected override Rectangle GetTabRect(int index)
    {...}

我收到此错误

错误 1“TabControl.GetTabRect(int)”: 无法更改访问修饰符 覆盖“公共”继承成员 'System.Windows.Forms.TabControl.GetTabRect(int)'

Error2'TabControl.GetTabRect(int)': 不能覆盖继承的成员 'System.Windows.Forms.TabControl.GetTabRect(int)' 因为它没有标记为虚拟, 抽象或覆盖

我该怎么做?

编辑

如果我使用公共:

TabControl.GetTabRect(int)': cannot override inherited member 'System.Windows.Forms.TabControl.GetTabRect(int)' because it is not marked virtual, abstract, or override

【问题讨论】:

  • 该方法未标记为virtual,因此您无法覆盖它(无论访问修饰符如何)
  • @Ste:它不应该被覆盖
  • 他不能使用public new Rectangle GetTabRect(int index)吗?
  • @Roflcoptr:这将隐藏基类方法,但不会覆盖它 - 这意味着如果您使用键入的引用访问他的类基类,基类方法仍然会执行。

标签: c# overriding


【解决方案1】:

方法是公开的。因此,当您覆盖它时,您无法对其进行保护。所以你必须保持公众的知名度。

应该是这样的:

public override Rectangle GetTabRect(int index)

【讨论】:

  • 当然是+1,而且说代码明智,这意味着拥有public override Rectangle GetTabRect(int index)
  • 干杯,需要记住那些显而易见的事情对每个人来说都不是显而易见的。 :-)
【解决方案2】:

问题在于您通过覆盖有效地隐藏了该功能。您需要保持函数的 public 特性,因为在覆盖方法时无法更改签名。

【讨论】:

    【解决方案3】:

    TabControl.GetTabRect() 方法是公开的,它是非虚拟的,因此您可能需要为您要解决的问题找到不同的解决方案。即使您使用 new 关键字覆盖此方法,基类仍然不会调用您的实现,因为它不是虚函数。

    您可以尝试处理 DrawItem 事件并自己渲染选项卡 - 这可能需要更多工作,但它可以让您控制选项卡的渲染方式,然后您可以使用任何您想要的边界矩形。

    你想做什么需要覆盖 GetTabRect() 方法?

    【讨论】:

      【解决方案4】:

      您收到的错误消息似乎清楚地表明您在覆盖该方法时无法限制/更改访问。 您可以将其覆盖为公共。 您是否有特定原因需要保护您的 GetTabRect?

      【讨论】:

        猜你喜欢
        • 2011-04-11
        • 2011-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多