gpt4 book ai didi

c# - 我如何更改嵌套构造函数的调用顺序(抽象父级之前的子级)

转载 作者:太空宇宙 更新时间:2023-11-03 18:12:50 25 4
gpt4 key购买 nike

下面的代码抛出异常,因为抽象构造函数在子构造函数之前被调用。

我需要提供一个抽象类来封装程序不同部分的一些逻辑。但是,我还需要检查抽象成员是否在创建后正确初始化,而子类对此没有任何影响。

下面的编译示例应该可以说明我的问题。

using System;

namespace Stackoverflow
{
class Program
{
static void Main(string[] args)
{
var x = new Thing(5);
var y = new Child(x);
}
}

class Child : AbstractParent
{
Thing childthing;

public Child(Thing provided) : base(){
childthing = provided;
}

public override void Initialise(){
//Exception is thrown here - childthing is still null
parentthing = childthing.Add(1);
}
}

abstract class AbstractParent
{
protected Thing parentthing;

public AbstractParent(){
Initialise();
AssertThingyNotNull();
}

private void AssertThingyNotNull(){
if (parentthing == null) throw new Exception("Waaa");
}

public abstract void Initialise();

}

class Thing
{
private int i;

public Thing(int i){
this.i = i;
}

public Thing Add(int b){
i += b;
return new Thing(i);
}
}
}

编辑#1:

是否有某种方法可以通过反射(reflect)到调用者(应该是 child rigth 的创建者?)然后在该调用结束时使用react来做到这一点?

编辑#2:获取创建子对象的 .ctor 很容易。操纵这些方法似乎介于不可能和坏主意之间。

        foreach (StackFrame frame in new StackTrace().GetFrames())
{
Console.WriteLine(frame.GetMethod().Name);
}

最佳答案

基本上,你不能。这就是为什么您应该尽可能避免从构造函数调用虚拟(或抽象)成员的原因 - 您最终可能会得到在不完整的上下文中运行的代码。任何变量初始值设定项都在调用基类构造函数之前执行,但构造函数主体中的任何代码都不会执行。

如果您需要执行初始化并且只想在派生类构造函数运行时执行初始化,那么只需从派生类构造函数调用 Initialise 即可开始。

关于c# - 我如何更改嵌套构造函数的调用顺序(抽象父级之前的子级),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11508372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com