2016-09-12 64 views
2

大家好我是用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>(); 

我会用新方法

UPDATE 1

我做了示例更好,我想在基本控制器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; 
} 

UPDATE 2 我试图做到这一点

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

为什么你不从'Base'的'SoldierPlayer'继承?如果你想这样做,在你的'BasePlayer'中它应该有一个像这样的'public Derived x;'的字段。我强烈建议你,你看看[Polymorphismus](https://msdn.microsoft.com/de-de/library/ms173152.aspx)。 –

+0

您正在寻找*抽象类和方法*和*虚拟方法*。谷歌,首先。 –

+0

不应该简单地把'x'变成'Derived'类型吗? – Sinatr

回答

2

你不能叫SoldierPlayer.x.Gun();因为SoldierPlayer.x有TY没有方法Gun()的pe Base。 OOP世界和C#可以为您提供许多解决方案,您的选择取决于您的目标。

他们中的一些(通过最佳实践顺序):

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

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回答您的新要求s

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 
} 
+0

对于选项1,您应该在基础中创建方法'virtual'并在派生类中覆盖它。你需要解释其他选项。 – juharr

+0

我无法访问manager.user.energy – Jumper404

+0

我刚刚提供了一个实例。我向你展示如何解决经理人员的这种情况。你应该与用户成员 – burzhuy