在以下 Unity/C# 代码中,collider
变量产生以下警告:
Warning CS0108 'Controller2D.collider' hides inherited member 'Component.collider'. Use the new keyword if hiding was intended.
这是什么意思,我该如何解决?
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# 中,您可以将方法、属性、索引器或事件定义为虚拟的(使用“virtual”关键字)。通过这样做,您声明虚拟成员可以在派生类中被覆盖。
- 私有(private)成员不能是虚的,因为它们不会被子类继承,所以不能被覆盖。
- 如果您不使用“virtual”声明父类的非私有(private)成员,而是将成员添加到具有相同名称的子类,则意味着您隐藏了父成员。
- 虽然“virtual”和“override”关键字不适用于字段成员,但隐藏字段成员的概念和“new”关键字适用。这意味着如果您在父类中定义一个非私有(private)字段成员,然后在派生类中定义一个具有相同名称的字段,您将隐藏父成员。在您的情况下,警告意味着 MonoBehaviour(或其父类之一)定义了一个名为“collider”且类型为“BoxCollider2D”的公共(public)或 protected 字段。
- 我想说的是,如果您是父类的作者,并且您可以看到隐藏父类成员的后果,那么您可能想要这样做(尽管不推荐)。
- 但是,在您的情况下,您不拥有“MonoBehaviour”源代码,虽然添加“new”关键字会抑制警告消息,但应该避免整个情况,否则您会遇到奇怪的多态性问题.
- 通过避免,我的意思是简单地将您的“collider”字段重命名为其他名称,例如“boxCollider2D”
p.s.1 “奇怪的多态性问题”是指根据您的对象指针,将使用父类成员或子类成员。您可以在此处阅读更多信息:https://stackoverflow.com/a/22809757/1854557 p.s.2 在我的测试代码中,当我添加和删除新键盘时,结果是一样的。所以似乎不添加 new 关键字只会生成警告,但不会改变继承/多态性的行为。
关于c# - 隐藏继承成员警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53602702/