我正在创建一个具有这样的构造函数的对象......
public class BusinessLogic()
{
public BusinessLogic()
{
BusinessLogicSubClass blsc = new BusinessLogicSubClass(and I want to pass in BusinessLogic here)
}
}
我这样做是因为我希望BusinessLogicSubClass在完成一个或另一个方法时回调BusinessLogic中的各种方法。 BusinessLogicSubClass还使用构造函数注入,以使我的单元测试与NMock2一起使用。
此处的任何建议都会对您有所帮助!
答案 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的第一次尝试似乎工作得很好。 :)