【问题标题】:Polymorphism, Calling child method of parent多态性,调用父级的子级方法
【发布时间】:2016-09-12 11:24:07
【问题描述】:

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

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

我做了一个更好的例子,我想在 Base 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;
}

【问题讨论】:

  • 你为什么不从Base继承你的SoldierPlayer?如果你想这样做,在你的BasePlayer 中应该有一个像public Derived x; 这样的字段。我强烈建议你看看Polymorphismus
  • 您正在寻找抽象类和方法以及虚拟方法。先谷歌一下。
  • 不应该只是 x 的类型为 Derived
  • Base 和 Derived 是其他类,我知道使用虚拟方法,但这种情况我提出我不知道,@Sinatr 我不能,因为我是从核心类继承的。
  • @ChristophKn 有一条评论,他的评论实际上是您问题的答案。 public Base x; 应该是 public Derived x;

标签: c# inheritance unity3d polymorphism


【解决方案1】:

您不能调用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
}

【讨论】:

  • 对于选项一,您应该在基类中创建方法virtual,在派生类中创建override。您需要解释其他选项。
  • 我只是提供了一个例子。我向您展示如何为经理成员解决这种情况。您应该对用户成员做同样的工作
  • 我做到了,你能看到我的第二次更新吗?
  • @Xafi,只需阅读有关整个主题的一些内容,您缺少一些基本的抽象。
猜你喜欢
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多