如何在C#的__init__块的末尾编写Python的super()调用?

时间:2015-06-29 17:51:26

标签: c# python inheritance

我一直在将大量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...");
        }
    }
}

0 个答案:

没有答案