c# - 隐藏继承成员警告

标签 c# unity3d inheritance

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

相关文章:

c# - Unity - OnBeginDrag/OnDrag 等不工作

java - 强制基类使用自己的方法而不是重写方法

c#-4.0 - 不包含带有 0 个参数的构造函数

c# - 隐藏派生类

c# - 有没有好的解析C#3.0代码的方法?

javascript - 如何防止将数据传递给 Controller

c# - Unity - 像音速一样运行一个循环而不会掉下来

android - 应用程序在旋转时死于 “Sending signal. SIG: 9”

c# - SQL CE 4 (CTP) 是否支持使用 System.Transaction 命名空间的环境事务?

c# - 比较两个 DateTimeOffset 对象