c# - 隐藏继承的成员警告
问题描述
在以下 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# 中,您可以将方法、属性、索引器或事件定义为虚拟(使用“virtual”关键字)。通过这样做,您声明可以在派生类中覆盖虚拟成员。
- 私有成员不能是虚拟的,因为它们不会被子类继承,所以它们不能被覆盖。
- 如果您没有使用“虚拟”声明父类的非私有成员,而是将成员添加到具有相同名称的子类中,则意味着您隐藏了父成员。
- 虽然“virtual”和“override”关键字不适用于字段成员,但隐藏字段成员的概念和“new”关键字却适用。这意味着如果您在父类中定义非私有字段成员,然后在派生类中定义具有相同名称的字段,您将隐藏父成员。在您的情况下,警告意味着 MonoBehaviour(或其父类之一)定义了一个名为“BoxCollider2D”类型的“collider”的公共或受保护字段。
- 我会说,如果您是父类的作者,并且您可以看到隐藏父成员的后果,您可能想要这样做(尽管不推荐)。
- 但是,在您没有“MonoBehaviour”源代码的情况下,虽然添加“new”关键字会抑制警告消息,但应该避免整个情况,否则您会遇到奇怪的多态性问题。
- 通过避免,我的意思是简单地将您的“对撞机”字段重命名为“boxCollider2D”之类的其他名称
ps1 “奇怪的多态性问题”是指根据您的对象指针,将使用父类成员或子类成员。您可以在此处阅读更多内容:https : //stackoverflow.com/a/22809757/1854557 ps2 在我的测试代码中,当我添加和删除新键盘时,结果是一样的。所以似乎没有添加 new 关键字只会生成警告,但不会改变继承/多态的行为。
推荐阅读
- python - 在pyowm中找不到城市时如何创建输出?
- elasticsearch - Elasticsearch:获取同一文档中的每个字段分数
- r - Plotly:双 y 轴图弄乱了折线图
- android - 如何在 Qt Creator for android 中设置 ndk 路径?
- laravel - 我如何访问 laravel 上的会话?
- python - 使用 Selenium 解析动态加载的网页
- python - 更新模型一部分的权重 (nn.Module)
- flask - 为什么路由“/login”和“/register”不起作用?
- c++ - RadioMedium 的 maxCommunicationRange 参数和 Radio 发射机的功率参数之间有什么关系?
- google-analytics - 如何从服务器端设置 Google Analytics(Firebase 分析)用户属性?