c# - 多态,调用父类的子方法

标签 c# inheritance unity-game-engine polymorphism

大家好,我正在使用 C# 在 Unity3d 中进行编程,当我编写代码时,我遇到了一个小问题,我给你们写了一个例子,因为我不知道解释一下。

class Base
{
    public string name;
}
class Derived : Base
{
    public void Gun();
}

class BasePlayer
{
    public Base x;
}

class SoldierPlayer : BasePlayer
{ 

}

情况是这样的,我想做那样的事情

SoldierPlayer.x.Gun();

但我不知道该怎么做

真实案例是这样的

 public class BasePlayerController : MonoBehaviour
        {

            public BasePlayerManager playerManager; 
...
public class RobotPlayerController : BasePlayerController {
...
playerManager = gameObject.AddComponent<RobotPlayerManager>();

我将使用新方法

更新1

我做了一个更好的例子,我想在基本 Controller manager.user.energy中做并被视为下一个类型RobotManager.RobotUser.energy

BaseController
BaseManager
BaseUser

class BaseController
{
    BaseManager manager;
    public virtual void Move(int x,int y)...
}

class BaseManager {
    BaseUser user;
    public virtual Pause(bool state);
}

class BaseUser {
    int life
}

RobotController
RobotManager
RobotUser

class RobotController : BaseController
{
    // manager as RobotManager?
    public void Ray(int x,int y);
}

class RobotManager : BaseManager
{
    // user as RobotUser?
}

class RobotUser : BaseUser 
{
    int energy;
}

更新2 我试图做到这一点

public Run()
{
    RobotController rc = new RobotController();
    rc.manager.energy;
}

最佳答案

您无法调用 SoldierPlayer.x.Gun(); 因为 SoldierPlayer.x 的类型 Base 没有方法 Gun( )。 OOP 世界和 C# 可以为您提供许多解决方案,您的选择取决于您的目标。

其中一些(按最佳实践排序):

1) 重写多态性。将 .Gun() 方法添加到 Base 类中,并在派生类中实现它。例如

class Base
{
    public string name;
    public void virtual Gun()
    {
        Trace.Log("I'm base class, i can't do anything");
    }
}
class Derived : Base
{
    public override void Gun()
    {
        Consule.WriteLine("Hello i have gun");
    }
}

class Derived2 : Base
{
    public override void Gun()
    {
        Consule.WriteLine("Hello i have 2 guns");
    }
}

2) 重载多态性 在许多来源中,这种方法被称为某种多态性 AD-HOC

public void GunAction(Derived2 o)
{
    o.Gun();
}
public void GunAction(Derived1 o)
{
    o.Gun();
}
public void GunAction(Base o)
{
    Trace.Log("I'm base class, i can't do anything");
}

3) 施放

public void GunAction(Base o)
{
    if(o is Derived1 )
        o.Gun();
    if(o is Derived2 )
        o.Gun();
}

更新 1 满足您的新要求

class BaseController
{
    public BaseManager manager;
...

class RobotController1 : BaseController
{
    // manager as RobotManager? - no it is stil BaseManager
    public void Ray(int x,int y);
}


class RobotController2 : BaseController
{
    // manager as RobotManager? - yes. now it is RobotManager 
    public void Ray(int x,int y);

    public RobotController2()
    {
        manager = new RobotManager();
    }
}

public void Run()
{
    var controller = new RobotController2();// you have RobotManager 
    controller.manager = new BaseManager();// it is again BaseManager
}

关于c# - 多态,调用父类的子方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39449229/

相关文章:

c# - 接口(interface)的隐式和显式实现

java - Name Clash, override fail, on a class 实现两个具有相同删除的接口(interface)

ssl - 有没有办法防止Unity中的javax.net.ssl.SSLHandshakeException因为服务器不支持SSLv3来防止poodle攻击?

c# - 如何知道图像用于哪个预制件

ios - 将 OpenCV 框架导入 Unity 项目 iOS 时出错

c# - TFS 构建代理跳过所有测试

c# - 完整性检查 : Do these nested . 所有调用都等同于 LINQ 中相应的 .Where 和 .SelectMany 调用?

java - 调用 super 需要 try/catch

C++ 重写方法未被调用

c# - 如何关闭 Windows 服务应用程序的所有后台线程?