gpt4 book ai didi

C# 继承和成员隐藏

转载 作者:太空宇宙 更新时间:2023-11-03 17:24:44 27 4
gpt4 key购买 nike

我正在 Unity 游戏引擎中开发 2D 太空射击游戏。

我有一个基类,其中包含所有敌方 spaceship 共享的变量,并且该基类包含旨在由派生类的每个实例调用的函数。以这个 void Start() 函数为例:

基类

public class EnemyBaseScript : MonoBehaviour 
{
// some public/protected variables here

protected void Start ()
{
// some initializations shared among all derived classes
}
.
.
.
}

派生类

public class L1EnemyScript : EnemyBaseScript 
{
// Use this for initialization
void Start ()
{
base.Start (); // common member initializations
hp = 8; // hp initialized only for this type of enemy
speed = -0.02f; // so does speed variable
}
}

我想你明白了。我希望在 base.Start() 函数中完成常见的初始化,并在此 Start() 函数中完成特定于类的初始化。但是,我收到警告:

Assets/Scripts/L1EnemyScript.cs(7,14): warning CS0108: L1EnemyScript.Start() hides inherited member EnemyBaseScript.Start(). Use the new keyword if hiding was intended

我在 OOP 和 C# 方面缺乏经验,那么按照我的想法做事的正确方法是什么?这个警告是什么意思,我该如何正确处理?

最佳答案

在 C# 中,继承具有相同函数签名的函数将隐藏前一个函数。

Take the example from Microsoft's website :

class Base
{
public void F() {}
}
class Derived: Base
{
public void F() {} // Warning, hiding an inherited name
}

但是隐藏函数可能不是你想要的:

class Base
{
public static void F() {}
}
class Derived: Base
{
new private static void F() {} // Hides Base.F in Derived only
}
class MoreDerived: Derived
{
static void G() { F(); } // Invokes Base.F
}

相反,你可以做的是让你的基本功能“虚拟”:

public class EnemyBaseScript : MonoBehaviour 
{
// some public/protected variables here

public virtual void Start ()
{
// some initializations shared among all derived classes
}
.
.
.
}

然后我们可以覆盖它:

public class L1EnemyScript : EnemyBaseScript 
{
// Use this for initialization
public override void Start ()
{
base.Start (); // common member initializations
hp = 8; // hp initialized only for this type of enemy
speed = -0.02f; // so does speed variable
}
}

关于C# 继承和成员隐藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21999059/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com