直接访问基类变量/对象c#

ata*_*air 3 c#

public class myWorld
{
    public int data;
    public void ChangeData()
    {
        data = 10;
    }
}

public class myRobot : myWorld
{
    public void robotChangesData()
    {
        //how can i make the robot change the data in world?
    }
}
Run Code Online (Sandbox Code Playgroud)

我(或多或少)明白这不应该这样做,并且已经被问过一千次了,因为每次改变都应该通过方法 - 但是:

如果我们继续以世界和机器人为例,稍后我希望为机器人提供一种方法,例如:robot.MoveBox(25) 机器人必须能够访问世界、对象框,并对绘图对象(网格、形状等)进行更新。)我现在唯一能想到的就是传递机器人的每种方法(例如movebox,或robotChangesData)整个世界+盒子+绘图作为“参考”,然后他可以更改它..但是每个方法看起来像robot.MoveBox(25, ref myworldObject, ref myworldBoxes,ref etc etc)

这真的是正确的方法吗?还是我错过了一些重要的事情?

bas*_*bas 6

也许一个例子有帮助:

你的机器人基础类

public class RobotBase
{
    protected int data;

    // Reference to the world
    protected World _world;

    public RobotBase(World world)
    {
        _world = world;
    }

    public void ChangeData()
    {
        data = 10;
    }
}
Run Code Online (Sandbox Code Playgroud)

您的机器人类别:

public class Robot : RobotBase
{
    public Robot(World world) : base(world)
    {}

    public void RobotChangesData()
    {
        //Change data in base
        data = 20;

        // Change data in world, the object is passed by reference, no need for further "ref" declarations
        _world.Terminate();
    }
}
Run Code Online (Sandbox Code Playgroud)

您的世界级:

public class World
{
    public void Terminate() 
    {
       // terminate world! noooess!
    }
}
Run Code Online (Sandbox Code Playgroud)