代码之家  ›  专栏  ›  技术社区  ›  MrFox

如何在其他构造函数中调用构造函数?

  •  0
  • MrFox  · 技术社区  · 14 年前

    我的类有很多属性,其中一个构造函数将它们全部设置,我希望默认构造函数调用另一个构造函数并使用set属性。但我需要先准备参数,所以从头调用它不会有帮助。

    我想做的是:

    public class Test
    {
        private int result, other;
    
            // The other constructor can be called from header,
            // but then the argument cannot be prepared.
            public Test() : this(0)
            {
            // Prepare arguments.
            int calculations = 1;
    
            // Call constructor with argument.
            this(calculations);
    
            // Do some other stuff.
            other = 2;
        }
    
        public Test(int number)
        {
            // Assign inner variables.
            result = number;
        }
    }
    

    所以这是不可能的,有人知道如何调用我的构造函数来设置代码中的参数吗?目前我正在存储另一个构造函数的对象副本并复制所有属性,这真的很烦人。

    3 回复  |  直到 14 年前
        1
  •  5
  •   Charles Bretana    9 年前

    对。在第一次调用中传递值1

    public class Test
    {    
        private int result, other;
        public Test() : this(1)        
        {        
           // Do some other stuff.        
           other = 2;    
        }    
        public Test(int number)    
        {        
            // Assign inner variables.        
            result = number;    
        }
    

    }

    你为什么不能准备好辩论呢?

    public class Test
    {    
        private int result, other;
        public Test() : this(PrepareArgument())
        {        
           // Do some other stuff.        
           other = 2;    
        }    
        public Test(int number)    
        {        
            // Assign inner variables.        
            result = number;    
        }
        private int PrepareArgument()
        {
             int argument;
             // whatever you want to do to prepare the argument
             return argument;
        }
    }
    

    或者。。。如果要从默认构造函数调用prepareArgument,则它不能依赖于传入的任何参数。如果它是一个常数,就让它成为一个常数。。。

    public class Test
    {   
        const int result = 1;
        private int result, other;
        public Test() 
        {        
           // Do some other stuff.        
           other = 2;    
        }    
    }
    

    如果它的价值依赖于其他外部状态,那么你可能会重新考虑你的设计。。。为什么不在调用构造函数之前先计算一下呢?

        2
  •  1
  •   Steve Danner    14 年前

    听起来有点重构会有帮助。当你做不到的时候 确切地 你想做什么,总有其他选择。我意识到你的实际代码可能比你给出的代码更复杂,所以以这个为例重构你的问题。将所有公共代码提取到新的 SetVariables 方法。

    public class Test
    {
        private int result, other;
    
            // The other constructor can be called from header,
            // but then the argument cannot be prepared.
            public Test() : this(0)
            {
            // Prepare arguments.
            int calculations = 1;
    
            // Call constructor with argument.
            SetVariables(calculations);
    
            // Do some other stuff.
            other = 2;
        }
    
        public Test(int number)
        {
            // Assign inner variables.
            SetVariables(number);
        }
    
        private void SetVariables(int number)
        {
            result = number;
        }
    }
    
        3
  •  0
  •   Femaref    14 年前

    如果要调用构造函数,但无法从头调用,则唯一的方法是定义私有 Initialize 方法。看起来你在你的构造器中做“真正的工作”,这不是构造器的任务。您应该考虑一种不同的方法来实现您的目标,因为您的方法严重禁止调试和其他人阅读您的代码。