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

时间:2009-02-03 17:25:34

标签: c#

我正在创建一个具有这样的构造函数的对象......

public class BusinessLogic()
{

     public BusinessLogic()
      {

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

我这样做是因为我希望BusinessLogicSubClass在完成一个或另一个方法时回调BusinessLogic中的各种方法。 BusinessLogicSubClass还使用构造函数注入,以使我的单元测试与NMock2一起使用。

此处的任何建议都会对您有所帮助!

8 个答案:

答案 0 :(得分:6)

您可以在构造函数中使用this。但这通常不是一个好主意,因为这意味着你在对象完成构建之前已经发布了一个引用。

为什么你在类本身中创建一个子类并不是很清楚 - 我怀疑你的继承层次结构可能并不理想。您能否提供更多细节,以便我们能够推荐更好的设计模式?

答案 1 :(得分:5)

 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();
    }
}

答案 2 :(得分:1)

您是否可以在属性上使用延迟实例化来延迟BusinessLogicSubClass的实例化,以便在需要时和BusinessLogic完成构建时进行实例化?我认为这将是一个更好的设计。 E.g。

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,这对于未正确构造的对象来说不是一个好主意 - 尽管可能没问题,具体取决于其他内容。

答案 3 :(得分:0)

我猜你想要传递你刚刚创建的课程。使用this关键字,它传递当前对象。

public class BusinessLogic()
{

     public BusinessLogic()
      {

           BusinessLogicSubClass blsc = new BusinessLogicSubClass(this)
      }
}

答案 4 :(得分:0)

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

public class BusinessTest
{
    private BusinessSubTest aSub;

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

}

public class BusinessSubTest
{
    public BusinessSubTest(BusinessTest aTest)
    {

    }    
}

或者我误读了这个问题?

答案 5 :(得分:0)

“这个”怎么样,例如

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

答案 6 :(得分:0)

如何使用构造BusinessLogic的静态方法,然后构造将BusinessLogic实例传递到其构造函数的BusinesLogicSubClass。

然后使用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;
    }
}

所以构造函数被标记为private,因此构造对象的唯一方法是通过调用静态方法,就像这样......

BusinessLogic bl = BusinessLogic.CreateBusinessLogic();

答案 7 :(得分:0)

看起来好像这是有效的。我以为这给我带来了错误。

使用Initialize而不是构造函数听起来相当不错,我想我会切换到它。

Lazy instantiation看起来很不错,但是这个类现在是启动这个应用程序的类。也许我需要更多的东西来使这个工作?(就像调用属性的东西?我想我有一个懒惰实例化的调用者..我将不得不考虑更多。

我必须从Si Keep说出来,我不能理解答案。也许一个例子可以帮助我理解。

感谢您的帮助。我将在稍后尝试注册,因为Stack Overflow的第一次尝试似乎工作得很好。 :)