C#将当前对象传递到另一个对象中?

5
我正在创建一个对象,它的构造函数如下所示...
public class BusinessLogic()
{

     public BusinessLogic()
      {

           BusinessLogicSubClass blsc = new BusinessLogicSubClass(and I want to pass in BusinessLogic here)
      }
}

我这样做是因为我希望BusinessLogicSubClass在完成一个方法或另一个方法时回调到BusinessLogic中的不同方法。 BusinessLogicSubClass还使用构造函数注入,以便我的单元测试可以与NMock2一起使用。
任何建议都将非常有帮助,提前感谢!
8个回答

7
 public BusinessLogic()
  {
       BusinessLogicSubClass blsc = new BusinessLogicSubClass(this);
  }

为了解决Jon Skeet的评论,另一种方法是使用构造函数和初始化程序来使用“this”指针:

public class BusinessLogic 
{
    private BusinessLogicSubClass blsc = null;

    public BusinessLogic() {}

    public void Initialize()
    {
        blsc = new BusinessLogicSubClass(this);
    }
}

public class Implementor
{
    public void SomeFunction()
    {
        BusinessLogic bl = new BusinessLogic();
        bl.Initialize();
    }
}

6

你可以在构造函数中使用this。但是一般来说这不是一个好主意,因为它意味着在对象完成构造之前就发布了引用。

不过,如果你在类内部创建子类,那么你的继承层次可能不太理想。你能否提供更多信息,以便我们能够推荐更好的设计模式呢?


我同意这个观点。如果你要使用它,我建议确保它是最后一个语句。Danny的基类是正确的选择。 - David Basarab
回复:层次结构不理想:是的,但这也可能适用于某些层次结构之外的类。我猜他可能并不是真正意味着“子类”在这里。 - TheSmurf

1

你能否在属性上使用延迟实例化,以便在需要时延迟实例化BusinessLogicSubClass,并在BusinessLogic完成构建后再进行实例化?我认为这将是更好的设计。例如:

public class BusinessLogic {

    private BusinessLogicSubClass mChild;

    public BusinessLogic() {
    }

    public BusinessLogicSubClass Child {
        get {
            return mChild ?? (mChild = new BusinessLogicSubClass(this));
        }
    }

    public class BusinessLogicSubClass {
        public BusinessLogicSubClass(BusinessLogic parent) {
        }
    }
}

使用延迟实例化来防止在原始构造函数中传递this,这对于未正确构造的对象来说不是一个好主意 - 尽管根据其他情况可能还可以接受。


0

看起来这个是有效的。 我以为它会报错。

使用Initialize而不是构造函数听起来不错,我想我会转换过去。

延迟实例化看起来很好,但这个类现在用于启动此应用程序的类。也许我需要更多东西来使其工作?(像调用该属性的东西?我想我有一个调用器可以懒惰地实例化它。我得再想想这个问题。

我必须说,对于Si Keep的答案,我已经超出了自己的领域,无法真正理解答案。也许一个例子能帮助我理解。

感谢您的帮助。 我将尝试注册,因为这次在Stack Overflow上的第一次尝试似乎运行得非常好。 :)


嗨,抱歉之前没有表达清楚,当时有点赶。我已经添加了一个例子。谢谢。 - Simon Keep

0

那么,你想要这样的东西吗:

public class BusinessTest
{
    private BusinessSubTest aSub;

    public BusinessTest()
    {
        aSub = new BusinessSubTest(this);
    }

}

public class BusinessSubTest
{
    public BusinessSubTest(BusinessTest aTest)
    {

    }    
}

还是我没有理解问题?


0

比如说,“这个”怎么样?

public BusinessLogic()
{
    BusinesLogicSubClass blsc = new BusinessLogicSubClass(this);
}

0

使用一个静态方法来构造BusinessLogic,然后构造BusinesLogicSubClass并将BusinessLogic实例传递到其构造函数中,这样怎么样?

然后在BusinessLogic实例上使用属性来传递BusinesLogicSubClass?

例如...

public class BusinessLogic
{
    private BusinessLogicSubClass subClass;

    private BusinessLogic()
    {
    }

    public static BusinessLogic CreateBusinessLogic()
    {
        BusinessLogic bl = new BusinessLogic();
        BusinessLogicSubClass blsc = new BusinessLogicSubClass(bl);

        bl.subClass = blsc;
        return bl;
    }
}

因此,构造函数被标记为私有,所以构造对象的唯一方法是通过调用静态方法,如下所示...

BusinessLogic bl = BusinessLogic.CreateBusinessLogic();

-1

我猜你想将它传递给你刚刚创建的类。使用this关键字,它可以传递当前对象。

public class BusinessLogic()
{

     public BusinessLogic()
      {

           BusinessLogicSubClass blsc = new BusinessLogicSubClass(this)
      }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接