隐藏继承成员警告

Ben*_*Ben 3 c# inheritance unity-game-engine

在以下 Unity/C# 代码中,该collider变量会产生以下警告

警告 CS0108“Controller2D.collider”隐藏继承成员“Component.collider”。如果打算隐藏,请使用 new 关键字。

这是什么意思以及如何解决它?


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// require that our object has a box-collider-2d component
[RequireComponent(typeof(BoxCollider2D))]

// controller-2D script
public class Controller2D : MonoBehaviour {

    // stores a reference to our object's box-collider-2d component
    BoxCollider2D collider; // the warning occurs here

    // ...
}
Run Code Online (Sandbox Code Playgroud)

Sia*_*avi 7

这是一个迟到的答案,但您可能会发现它很有用。在深入研究您的问题之前,先介绍一下:

  • 在 C# 中,您可以将方法、属性、索引器或事件定义为虚拟(使用“virtual”关键字)。通过这样做,您就声明可以在派生类中重写虚拟成员。
    • 私有成员不能是虚拟的,因为它们不会被子类继承,因此它们不能被覆盖。
  • 如果您没有使用“virtual”声明父类的非私有成员,但您向子类添加了具有相同名称的成员,则意味着您隐藏了父成员。
  • 虽然“virtual”和“override”关键字不适用于字段成员,但隐藏字段成员的概念和“new”关键字却适用。这意味着,如果您在父类中定义非私有字段成员,然后在派生类中定义具有相同名称的字段,则您将隐藏父成员。在您的情况下,警告意味着 MonoBehaviour (或其父类之一)定义了一个名为“Collider”、类型为“BoxCollider2D”的公共或受保护字段。
  • 我想说,如果您是父类的作者,并且您可以看到隐藏父成员的后果,您可能会想要这样做(尽管不推荐)。
  • 但是,在您的情况下,如果您不拥有“MonoBehaviour”源代码,尽管添加“new”关键字会抑制警告消息,但应该避免整个情况,否则您会遇到奇怪的多态性问题。
  • 通过避免,我的意思是简单地将您的“collider”字段重命名为其他名称,例如“boxCollider2D”

ps1 “奇怪的多态性问题”我的意思是根据您的对象指针,将使用父类成员或子类成员。您可以在此处阅读更多信息: https: //stackoverflow.com/a/22809757/1854557 ps2 在我的测试代码中,当我添加和删除新键盘时,结果是相同的。因此,似乎不添加 new 关键字只会生成警告,但不会改变继承/多态性的行为。