隐藏继承的成员警告

时间:2018-12-03 22:09:52

标签: c# unity3d inheritance

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

    // ...
}

2 个答案:

答案 0 :(得分:0)

这是一个较晚的答案,但您可能会发现它很有用。在深入探讨问题之前,请先进行介绍:

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

p.s.1“奇怪的多态性问题”是指根据您的对象指针,将使用父类成员或子类成员。您可以在这里了解更多信息:https://stackoverflow.com/a/22809757/1854557 第2页在测试代码中,当我添加和卸下新键盘时,结果是相同的。因此,似乎不添加new关键字只会生成警告,但不会更改继承/多态的行为。

答案 1 :(得分:-1)

这是一条警告,表示名为Controller2D的{​​{1}}的基类已经具有同名Component的属性。  出现警告是为了通知您,Controller2D的任何实现都将使用您的定义并“隐藏”基本定义。为了避免警告,只需将对撞机的定义更改为

新BoxCollider2D对撞机;

那么它将知道您的意思是隐藏这个王子,并且警告会消失。

没有太多理由这样做。公共和内部属性已经可用。如果您的属性与要隐藏的属性不匹配或扩展,则很可能会引起问题,因此,如果您不知道是否要隐藏另一个属性,则应将其重命名。