gpt4 book ai didi

c# - 调用派生类的构造函数先于基类的构造函数执行

转载 作者:太空狗 更新时间:2023-10-29 23:56:38 24 4
gpt4 key购买 nike

嗯,最初我在每个派生类中有几个具有不同值的常量(如 MAX_SPEED)。这个想法是在基类的某些方法中使用这些值。那时我意识到我不能用常量来做到这一点,所以我创建了只读属性。

我需要一种方法在实例化时将这些值分配给私有(private)字段,最好是在基类 中。但首先我必须在派生类中分配原始值。由于这些是属性,我找不到在定义时初始化它们的方法,所以唯一的方法是在派生的构造函数中。

这就是问题所在:值在分配给基类中的私有(private)字段后被初始化。我得到的解决方案是创建一个虚方法并在那里进行分配。

有没有一种方法可以从派生类调用基类构造函数,以便首先调用来自派生构造函数的代码?

class BaseClass
{
public BaseClass()
{
System.Console.WriteLine("This should be shown after");
}
}

class DerivedClass : BaseClass
{
public DerivedClass() : base()
{
System.Console.WriteLine("This should be shown first");
}
}

当然,在示例中它会以相反的方式工作。有解决办法吗?

最佳答案

没有。基类构造函数总是在派生类构造函数的主体之前执行。然而:

  • 派生类中的任何实例变量初始值设定项基类构造函数之前执行
  • 基类构造函数可以执行虚方法,这些方法可以在派生类中被重写。 虽然这几乎总是一个坏主意。(此时各种正常的前提条件都无效。您可以观察尚未设置的只读变量,因为它们将在构造函数主体中设置,例如。恶心。)

为了证明这两个:

using System;

class BaseClass
{
public BaseClass()
{
VirtualMethod();
Console.WriteLine("BaseClass ctor body");
}

public virtual void VirtualMethod()
{
Console.WriteLine("BaseClass.VirtualMethod");
}
}

class DerivedClass : BaseClass
{
int ignored = ExecuteSomeCode();

public DerivedClass() : base()
{
Console.WriteLine("DerivedClass ctor body");
}

static int ExecuteSomeCode()
{
Console.WriteLine("Method called from initializer");
return 5;
}

public override void VirtualMethod()
{
Console.WriteLine("DerivedClass.VirtualMethod");
}
}

class Test
{
static void Main()
{
new DerivedClass();
}
}

输出:

Method called from initializer
DerivedClass.VirtualMethod
BaseClass ctor body
DerivedClass ctor body

此外,如果您的基类构造函数接受一个参数,那么您可以在派生类中执行一些代码以提供参数:

DerivedClass() : base(SomeStaticMethod())

不过,所有这些都很臭。你的具体情况是什么?

关于c# - 调用派生类的构造函数先于基类的构造函数执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16498927/

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