【问题标题】:Can I make a "global" object to store variables for multiple objects?我可以创建一个“全局”对象来存储多个对象的变量吗?
【发布时间】:2012-11-13 03:23:26
【问题描述】:

我正在创建一个将显示多个图形的图形应用程序。这些图表需要访问一些全局数据和一些特定于图表的数据。例如,我希望颜色一致,这样就可以是全局的,但特定的图表可以有不同的网格间距(每个图表)。

我创建了一个带有设置默认值的“主对象”和一个带有每个图形配置选项的派生对象

class GraphMasterObject {
  public Color gridcolor = Color.Red;
}

class GraphObject : GraphMasterObject {
  public int gridSpacing = 10;
}

现在,根据我的理解,我应该可以做到这一点

GraphObject go = new GraphObject();
Color c = go.gridColor;

如果我更改 go.gridColor,我怎样才能使它在继承自 GraphMasterObject 的所有对象中发生变化?这甚至可能吗?如果不是,还有哪些其他可能的解决方案?类似的东西

GraphMasterObject gmo = new GraphMasterObject();
gmo.gridColor = Color.Blue;

GraphObject go = new GraphObject();
go.gridColor = Color.Blue;

【问题讨论】:

  • 为什么不使用gridColor的静态属性,而不是将其定义为实例属性?

标签: c# inheritance persistent


【解决方案1】:

为什么要使用继承?为什么不只是将 GlobalGraphSettings 对象传递给所有 Graph 对象,然后您就可以这样做

MyColor = Graph.GlobalSettings.Color;

【讨论】:

  • 是的。使用 IoC 框架来做这件事,这是一个更甜蜜的解决方案。同时,建立一个为您建立这种关系的工厂。单身很烂。
【解决方案2】:

在多个对象之间共享单个对象实例的一种常见方法是单例模式。

http://en.wikipedia.org/wiki/Singleton_pattern

使用单例模式,任何对象都可以请求单例对象,并且将返回与请求单例对象的任何其他对象相同的单例对象实例。

在您的情况下,这似乎是一个很好的解决方案。

在 C# 中实现此模式的一种方法是使用 static 属性,例如:

public class MySingleton
{
    static private MySingleton singleton = null;

    private static readonly object padlock = new object();

    static public MySingleton Retrieve
    {
        get
        {
            lock (padlock)
            {
                if (singleton == null) singleton = new MySingleton(); // Initialize as needed
            }
            return singleton;
        }
    }
}

用法

MySingleton singleton = MySingleton.Retrieve;

更新

这是一个优于上面的实现,来自@Marksl 提供的文章

public sealed class Singleton
{
    private static readonly Lazy<Singleton> lazy =
        new Lazy<Singleton>(() => new Singleton());

    public static Singleton Instance { get { return lazy.Value; } }

    private Singleton()
    {
    }
}

【讨论】:

  • 如果我的对象继承自单例,它也会是单例吗?我希望能够透明地访问对象和全局对象的数据
  • 我不完全同意单例。您还可以拥有一个对象的单个实例,这实际上与单例不同。如果值是不稳定的,每个线程都应该得到最新的副本。
  • @DarthVader:“对象的单个实例”与单例模式有何不同?
  • @DarthVader:根据我的回答中的注释,如果您在空检查和初始化周围添加锁定。
  • @EricJ。不,即使lock 也不会使其完全线程安全。而且单实例和单例显然是有区别的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 2013-03-03
  • 2014-08-09
  • 1970-01-01
相关资源
最近更新 更多