我一直在将大量Python代码移植到C#中,并经常在Python的super().__init__
块结尾处遇到__init__
调用。当派生类__init__
块中的某些python代码在调用基础构造函数之前执行某些操作时,会出现问题。在C#中,假设派生构造函数需要基础构造函数才能工作,并且在派生构造函数中完成“stuff”之前,首先调用它们。我通常的解决方法是编写一个静态方法并在base中调用它(例如public C : base( DoStuff(someVariable) )
。当我有一个参数基础构造函数时,这工作正常。但是如果我有三个参数怎么办?我不想使用三种不同的静态方法重复__init__
块代码三次,所以我写了一个返回第一个参数的方法,并在局部变量中设置其他参数。
在将结果传递给C#中的基础构造函数之前,是否有更好的方法可以在派生构造函数中对两个+变量执行操作?
以下是我编写的一些测试代码,用于观察我的解决方法的行为:
using System;
namespace BaseSuperTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("In Main...");
var B = new B(0,0,"zero");
Console.WriteLine();
var C = new C();
}
}
class A
{
public A(int first, int second, string third)
{
Console.WriteLine("\tIn A's constructor...");
Console.WriteLine("\t{0} {1} {2}", first, second, third);
}
}
class B : A
{
public static int Second { get; set; }
public static string Third { get; set; }
private static int DoStuff(int first, int second, string third)
{
Console.WriteLine("\t\tIn DoStuff()...");
Second = second + 1;
Third = "changed";
return first + 1;
}
public B(int first, int second, string third) : base(DoStuff(first, second, third), Second, Third)
{
Console.WriteLine("\t\tIn B's constructor...");
}
}
class C : B
{
public C() : base(0,0,"zero")
{
Console.WriteLine("\t\t\tIn C's constructor...");
}
}
}