编程策略 - 如何将对象传递到类链中

时间:2012-01-13 23:13:50

标签: c#

我正在努力改进我使用类和对象的策略。

通过一系列特定类传递对象以保持代码组织的最佳方法是什么。

示例:使用ZedGraph对象(注释)这可能不是最好的例子,但它可以解决这个问题。

class Graphhandler
{
    private ZedGraphControl ZGC;
    private SubGraphController PortionofGraph;

    public class GraphHandler(ZedGraphControl _ZGC)
    {
         ZGC = _ZGC;
         initializeGraph();
    }

    private void initializeGraph()
    {
        // notice I am putting the ZGC Object into another class
        // and likely that ZGC object will go into another class
        PortionofGraph = new SubGraphController(ZGC);
    }        
}    

class SubGraphController
{
    private ZedGraphControl ZGC;
    private DeeperSubGraphController PortionofGraph;

    public class SubGraphController(ZedGraphControl _ZGC)
    {
         ZGC = _ZGC;
         initializeSubGraph();
    }

    private void initializeSubGraph()
    {
        PortionofGraph = new DeeperSubGraphController(ZGC); 
        // is there a better way?
    }

}

是否有更好的方法将yop级别对象传递给所有这些调用以操纵数据?

4 个答案:

答案 0 :(得分:3)

通常,答案是将完全形成的依赖项传递到对象中。例如:

public GraphHandler(SubGraphController portionOfGraph) {
     this.portionOfGraph = portionOfGraph;
}

public SubGraphController(DeeperSubGraphController portionOfGraph) {
     this.portionOfGraph = portionOfGraph;
}


...

var zedGraphControl = new ZedGraphControl();
var deeperSubGraphController = new DeeperSubGraphController(zedGraphControl);
var subGraphController = new SubGraphController(deeperSubGraphController);
var graphHandler = new GraphHandler(subGraphController);

而不是直接在子图控制器中构造DeeperSubGraphController。如今,您通常使用依赖注入框架来协调所有这些。

(另见:Dependency Injection Myth: Reference Passing

答案 1 :(得分:1)

您可以查看Inversion Of Control(经常被忽略的IoC)。
它基本上是一个超级对象,可以让您随时随地访问其他对象。

答案 2 :(得分:0)

您可以尝试在此方案中使用继承。

答案 3 :(得分:0)

不同的控制器如何控制图形。通常,对象以您完成的方式传递 - 作为方法参数。如果一个对象需要/使用另一个对象(因为控制器控制你的情况下的图形)跨越不同的方法,那么它们被声明为该引用对象的成员,就像你所做的那样。如果单个方法需要它们,则将它们作为参数传递给对象的特定方法。

如果有一个更复杂的方案来控制特定顺序的图形,您可能需要查看chain of responsibility模式。