0

我有一个创建“数据持有者”对象的类,然后用一些修饰符类修改这个对象,类似于:

public class Process {
    public void Run() {
        var dataHolder = new DataHolder();

        var firstModification = new FirstModification(dataHolder);
        firstModification.Run();

        var secondModification = new SecondModification(dataHolder);
        secondModification.Run();

        //etc.
    }
}

public class FirstModification {

    DataHolder data_holder;

    public FirstModification (DataHolder dh) {
        data_holder = dh;
    }

    public void Run() {
        // do something with data_holder
    }
}

public class SecondModification {
    // etc.
}

在此代码中,每个修改构造函数必须接收dataHolder作为参数,并带有相应的样板,修改器类中的重复代码。

因此,如果可能和/或建议,我希望每个修改器对象都“已经知道”方法dataHolder内部存在的活动对象Process.Run()(可以说是它的“父范围”),而无需将其作为修饰符构造函数的参数。

编辑:我正在尝试实现管道(又名管道和过滤器)设计模式,灵感来自此处此处描述的内容。

谢谢你的帮助!

4

4 回答 4

3

因此,如果可能和/或建议,我希望每个修改器对象都“已经知道” Process.Run() 方法中存在的活动 dataHolder 对象(可以说是它的“父范围”),没有需要将其作为参数传递给修饰符构造函数。

可能的?是的,通过一个线程局部变量来维护“DataHolder这个线程的当前”(或者只是一个简单的静态变量,甚至)。

推荐的?不,我不会这么说。我认为您目前没有任何问题-您认为将所有内容都隐含会获得什么好处?

没有什么可以让你回到堆栈并在调用方法中找到局部变量......

于 2013-02-22T20:20:37.473 回答
1

您必须以某种方式关联实例

var firstModification = new FirstModification()

等与实际数据。

目前的做法还不错。如果您希望您的修改实例能够访问“父范围”,那么您必须将父对象引用传递给它们。这实际上为他们提供了比他们实际需要的更多访问父对象的权限,我不鼓励这样做。

于 2013-02-22T20:21:36.837 回答
0

对 Modifier 类进行超类化并将 DataHolder 对象作为静态变量从 Process 类中可用如何?

public class SuperModifierClass
{
    DataHolder dataHolder;

    public SuperModifierClass()
    {
        dataHolder = Process.DataHolder;
    }
}

public class FirstModifier
{
    public FirstModifier() : base() // Is base called implicitly by default? I forgot...
    {
    }
}

另一种选择是通过 MEF 和 Unity(谷歌这些术语)等框架来查看控制反转。这些本质上允许您做的是注册可以在实例化具有它们作为参数的新类时自动加载的对象。您会说“好吧,如果有人需要 DataHolder 对象,请使用这个”当您通过此类框架实例化修改类时,所谓的“容器”实际上会通过询问它是否已注册并获取参数来解析参数注册的实例。

于 2013-02-22T20:28:42.230 回答
0

为您的参数使用ref关键字。

...
var firstModification = new FirstModification(ref dataHolder);
...
public FirstModification (ref dataHolder dh) {
    // Make changes to dh
}
...

这会将对 dataHolder 对象的引用从 Process 类传递给您的 FirstModification 方法。

于 2013-02-22T20:21:05.573 回答