【问题标题】:C# - Access another class methodsC# - 访问另一个类方法
【发布时间】:2013-05-22 14:28:21
【问题描述】:

我有这样的事情:

public class Map
{
    class DataHandler
    {
        private int posX, posY;
        // Other attributes

        public int GetX() { return posX; }
        public int GetY() { return posY; }
        // Other functions for handling data (get/set)
    }

    class FileHandler
    {
        // Functions for reading/writing setting files
    }

    DataHandler Data;
    FileHandler Files;

    public Map()
    {
        Data = new DataHandler();
        Files = new FileHandler();
    }
}

现在,当我编写设置文件时,我需要读取DataHandler 类的一些变量(非静态)。 例如,假设我想使用GetXGetY 方法获取posXposY 的值,以便将它们写入文件中。如何从“文件”实例访问地图中的“数据”实例? 我知道我可以将 DataHandler 类的实例作为参数传递给写入文件的函数,但这并不像我想的那样。在我的想法中,它应该自己读取数据(在这种情况下为posXposY),因为它在同一个Map 类中。有没有干净的方法来做到这一点?

编辑:

我可以将Map 类的实例传递给FileHandler 构造函数,因此它可以访问其父类和数据,但我知道这不是解决问题的好方法。 所以,改变我的结构是没有问题的,我明白它有问题,否则我不会有这个问题,但我不知道如何改变它。如果您有任何建议,请随时写出来。

只是为了更好地解释上下文。我有一张地图,它由各种数据(x、y、高度、宽度、名称……)和一些描述它的图像组成(例如,地形高度的 RGB 图像,我已经计划好了类来处理图像)和一些设置文件。在其中一个文件中必须写入一些地图数据。 所以,我的想法是有一个父 Map 类,里面有处理数据、图像和文件的三个类,但是出现了这个问题,所以我认为它不是一个好的结构。

【问题讨论】:

  • 如果我对你的理解正确,你的结构应该稍微改变一下。 FileHandler 类应该有一个接受 Map(或 DataHandler)实例并写入数据的方法。
  • 更不用说你的例子中的设计失败了......这在技术上是不可能的。您如何预期 fileHandler 访问他的地图?从技术上讲,可能有很多对象持有对 fileHandler 的引用,因此没有“父”对象这样的概念(只有父类才有意义)。

标签: c# class methods


【解决方案1】:

在我的想法中,它应该自己读取数据(在这种情况下是 posX 和 posY),因为它在同一个 Map 类中。有没有干净的方法来做到这一点?

没有。您必须在 Map 类中的 DataHandlerFileHandler 之间来回传递数据,它们不会自动获知彼此的存在。

如果你能解释一下每件事应该做什么,那真的很有帮助,因为你的类名似乎有点太笼统了。

【讨论】:

    【解决方案2】:

    如果您强烈反对更改结构(但这是推荐的方式),我建议您重构 DataHandler 和 FileHandler - 将其实现为 Singleton,因此在代码的任何行中您都可以通过 DataHandler.Instance.GetX()FileHandler.Instance.SomeMethod() 访问它。

    单例的基本实现是:

    class DataHandler
    {
        private DataHandler() {}
        public GetX() { ... }
    
        private static DataHandler instance = null;
    
        public static Instance
        {
            get
            {
                if (instance == null)
                {
                    return (instance = new DataHandler());
                }
            }
        }
    }
    

    UPD:我的示例不是线程安全的。

    【讨论】:

      猜你喜欢
      • 2012-08-24
      • 2022-12-05
      • 1970-01-01
      • 2017-05-12
      • 2013-12-27
      • 2012-03-19
      • 2015-01-21
      • 2014-10-10
      • 2018-11-13
      相关资源
      最近更新 更多