2

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

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

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;
4

2 回答 2

3

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

MyColor = Graph.GlobalSettings.Color;
于 2012-11-13T03:38:06.080 回答
2

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

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

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

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

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

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()
    {
    }
}
于 2012-11-13T03:24:58.060 回答