【问题标题】:Change The Order Of Constructor Chaining in C#在 C# 中更改构造函数链接的顺序
【发布时间】:2013-12-19 20:45:34
【问题描述】:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ContructorChaining
{
    class AdditionOdMultipleNum
    {
        public AdditionOdMultipleNum(int a)
        {
            Console.WriteLine("sum of {0},1 is : {1}", a, (a + 1));

        }
        public AdditionOdMultipleNum(int a,int b)
            :this(a)
        {
            Console.WriteLine("sum of {0},{1} is : {2}", a, b, (a + b));
        }
        public AdditionOdMultipleNum(int a,int b,int c)
            :this(a ,b)
        {
            Console.WriteLine("sum of {0},{1},{2} is : {3}", a, b, c, (a + b + c));
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            AdditionOdMultipleNum addnum = new AdditionOdMultipleNum(2, 2, 6);

            Console.ReadKey(true);
        }
    }
}

在上面的例子中,程序显示的输出是 3,4,10 那么,是否有可能以时尚 10,4,3 看到输出

换句话说,我可以更改构造函数的执行顺序,即具有 3 个参数(带输出)的构造函数,然后它调用具有 2 个参数(带输出)的构造函数,最后它调用具有 1 个参数(带输出)的构造函数

【问题讨论】:

  • 你为什么想要???我认为这种行为没有充分的理由。

标签: c# constructor chaining


【解决方案1】:

将所有构造函数卸载到方法,从而允许您通过让方法在方法主体内的任意位置相互调用来提供所需的确切语义:

class AdditionOdMultipleNum
{
    public AdditionOdMultipleNum(int a)
    {
        Init(a);
    }
    public AdditionOdMultipleNum(int a, int b)
    {
        Init(a, b);
    }
    public AdditionOdMultipleNum(int a, int b, int c)
    {
        Init(a, b, c);
    }

    private void Init(int a)
    {
        Console.WriteLine("sum of {0},1 is : {1}", a, (a + 1));
    }
    private void Init(int a, int b)
    {
        Console.WriteLine("sum of {0},{1} is : {2}", a, b, (a + b));
        Init(a);
    }
    private void Init(int a, int b, int c)
    {
        Console.WriteLine("sum of {0},{1},{2} is : {3}", a, b, c, (a + b + c));
        Init(a, b);
    }
}

【讨论】:

    【解决方案2】:

    这种链接是不可能直接实现的;但是您可以使用工厂方法完成类似的操作:

    class AdditionOdMultipleNum
    {
        private AdditionOdMultipleNum() {}
        // A private constructor means that only methods 
        // within this class can construct new object directly
        // so let's make some factory methods:
    
        public static AdditionOdMultipleNum Create(int a)
        {
            Console.WriteLine("sum of {0},1 is : {1}", a, (a + 1));
            AdditionOdMultipleNum instance = new AdditionOdMultipleNum();
            // you can modify the instance here
            return instance;
    
        }
        public static AdditionOdMultipleNum Create(int a,int b)
        {
            Console.WriteLine("sum of {0},{1} is : {2}", a, b, (a + b));
            AdditionOdMultipleNum instance = Create(a);
            // you can modify the instance here
            return instance;
    
        }
        public static AdditionOdMultipleNum Create(int a,int b,int c)
        {
            Console.WriteLine("sum of {0},{1},{2} is : {3}", a, b, c, (a + b + c));
            AdditionOdMultipleNum instance = Create(a, b);
            // you can modify the instance here
            return instance;
        }
    }
    

    现在你可以打电话了

     AdditionOdMultipleNum addnum = AdditionOdMultipleNum.Create(2, 2, 6);
    

    这将导致按所需顺序输出10, 4, 3

    【讨论】:

    • 请注意,使用此策略在调用 Create 之前,您将无法与实例字段进行交互,这可能会或可能不会禁止使用此技术。
    【解决方案3】:

    不可能。当一个构造函数链接到另一个构造函数时,另一个构造函数的主体在第一个构造函数的主体之前运行。这是无法改变的。

    不过,这似乎是一个简化/人为设计的示例(您可能已对其进行了简化以方便发布,因此很容易理解,这是一件好事,谢谢);如果你能描述你的真实场景,也许有人可以提出调整或设计更改的建议,让它按照你想要的方式运行?

    【讨论】:

    • 感谢您的宝贵时间,这只是为了我的知识。
    猜你喜欢
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 2012-04-10
    • 2010-12-25
    • 1970-01-01
    • 2012-08-22
    • 2016-03-18
    • 1970-01-01
    相关资源
    最近更新 更多