C#实例化抽象类的嵌套类时如何自动传入父类实例无需手动传this
解决方案
方案1:基类提供受保护的工厂方法
在MainClass中定义受保护的工厂方法,方法内部自动将当前实例作为参数传入SpecializedClass构造函数,子类仅需传入剩余参数即可,无需手动传递this引用。
代码实现示例:
public abstract class MainClass { public SpecializedClass SpecialStuff { get; init; } /* General stuff happens here*/ // 受保护的工厂方法,自动注入当前实例作为parent参数 protected SpecializedClass CreateSpecialized(object stuff) { return new SpecializedClass(this, stuff); } public class SpecializedClass { private MainClass _parent; public SpecializedClass(MainClass parent, object stuff) { this._parent = parent; // Do stuff... } /* More specialized stuff happens here.*/ } } public class Foo : MainClass { public Foo() { this.SpecialStuff = CreateSpecialized("stuff"); // More stuff } }
如果SpecializedClass有多个参数不同的构造重载,可以对应在基类中添加多个不同入参的CreateSpecialized方法,适配不同场景的使用需求。
方案2:基类构造函数统一初始化
如果要求所有子类必须在构造阶段完成SpecialStuff的初始化,可以将实例化逻辑放到基类的构造函数中,子类仅需在调用基类构造时传入stuff参数即可,完全不需要手动处理SpecializedClass的实例化逻辑。
代码实现示例:
public abstract class MainClass { public SpecializedClass SpecialStuff { get; init; } // 基类构造统一完成SpecializedClass实例化 protected MainClass(object stuff) { SpecialStuff = new SpecializedClass(this, stuff); } /* General stuff happens here*/ public class SpecializedClass { private MainClass _parent; public SpecializedClass(MainClass parent, object stuff) { this._parent = parent; // Do stuff... } /* More specialized stuff happens here.*/ } } public class Foo : MainClass { public Foo() : base("stuff") { // More stuff } }
方案适用场景
- 工厂方法方案灵活性更高,适合子类需要控制
SpecializedClass实例化时机、或者存在非构造阶段初始化需求的场景 - 基类构造方案强制度更高,适合所有子类初始化逻辑一致的场景,可以完全避免子类漏传
this引用的问题
内容的提问来源于stack exchange,提问作者MechMK1
相关产品推荐
相关产品推荐

