大家好,我正在使用 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/