Calling the base constructor in C#

前端 未结 12 2786
南笙
南笙 2020-11-22 03:04

If I inherit from a base class and want to pass something from the constructor of the inherited class to the constructor of the base class, how do I do that?

For exa

12条回答
  •  一个人的身影
    2020-11-22 03:31

    Using newer C# features, namely out var, you can get rid of the static factory-method. I just found out (by accident) that out var parameter of methods called inse base-"call" flow to the constructor body.

    Example, using this base class you want to derive from:

    public abstract class BaseClass
    {
        protected BaseClass(int a, int b, int c)
        {
        }
    }
    

    The non-compiling pseudo code you want to execute:

    public class DerivedClass : BaseClass
    {
        private readonly object fatData;
    
        public DerivedClass(int m)
        {
            var fd = new { A = 1 * m, B = 2 * m, C = 3 * m };
            base(fd.A, fd.B, fd.C); // base-constructor call
            this.fatData = fd;
        }
    }
    

    And the solution by using a static private helper method which produces all required base arguments (plus additional data if needed) and without using a static factory method, just plain constructor to the outside:

    public class DerivedClass : BaseClass
    {
        private readonly object fatData;
    
        public DerivedClass(int m)
            : base(PrepareBaseParameters(m, out var b, out var c, out var fatData), b, c)
        {
            this.fatData = fatData;
            Console.WriteLine(new { b, c, fatData }.ToString());
        }
    
        private static int PrepareBaseParameters(int m, out int b, out int c, out object fatData)
        {
            var fd = new { A = 1 * m, B = 2 * m, C = 3 * m };
            (b, c, fatData) = (fd.B, fd.C, fd); // Tuples not required but nice to use
            return fd.A;
        }
    }
    

提交回复
热议问题