首页 > 解决方案 > 隐藏继承的成员警告

问题描述

在以下 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

    // ...
}

标签: c#unity3dinheritance

解决方案


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

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

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


推荐阅读