代码之家  ›  专栏  ›  技术社区  ›  Ian P

在发送到基本构造函数之前修改参数值

  •  29
  • Ian P  · 技术社区  · 15 年前

    标题可能有点模棱两可,但我想不出更好的表达方式。

    我意识到,在调用基本构造函数之前,我不能调用派生构造函数,但在将参数值传递给基元之前,我是否可以修改/创建参数值?

    例如,

    public enum InputType
    {
        Number = 1,
        String = 2,
        Date = 3
    }
    
    public class BaseClass
    {
        public BaseClass(InputType t)
        {
            // Logic
        }
    }
    
    public class DerivedClass : BaseClass
    {
        public DerivedClass(int i)
            : base(value)
        // Can I do something to infer what value should be here?
        {
            // Logic
        }
    }
    

    如果我有一个派生类,可以推断基本构造函数所需的值(在这个例子中, InputType.Number 对于 int ,)是否有方法在派生构造函数执行之前修改和/或创建传递给基构造函数的值?

    7 回复  |  直到 15 年前
        1
  •  47
  •   Don Kirkby    15 年前

    我希望您可以在基类构造函数的参数列表中调用静态方法。

    public class DerivedClass : BaseClass
    {
        public DerivedClass(int i)
            : base(ChooseInputType(i))
        {
        }
    
        private static InputType ChooseInputType(int i)
        {
            // Logic
            return InputType.Number;
        }
    }
    
        2
  •  5
  •   GBegen    15 年前

    可以使用静态方法计算传递给基构造函数的值。

    public class DerivedClass :
        BaseClass
    {
        public
        DerivedClass(int i) :
            base(ComputedValue(i))
        {
        }
    
        public static InputType
        ComputedValue(int i)
        {
            return InputType.Number; // or any other computation you want here
        }
    }
    
        3
  •  3
  •   Miguel Leite    15 年前

    您可以在派生类上创建静态方法,并将逻辑放在那里:

    public enum InputType {
        Number = 1,
        String = 2,
        Date = 3
    }
    
    public class BaseClass {
        public BaseClass(InputType t) {
            // Logic
        }
    }
    
    public class DerivedClass : BaseClass {
        public DerivedClass(int i)
            : base(GetInputType(i)) {
            // Is it possible to set "value" here?
            // Logic
        }
    
        private static InputType GetInputType(Int32 parameter) {
            // Do something with parameter
            // and return an InputType
    
            return (InputType)Enum.Parse(typeof(InputType), parameter);
        }
    }
    
        4
  •  2
  •   JaredPar    15 年前

    对。为了操作值,可以使用不访问实例的普通表达式。例如

    public DerivedClass(int i)
        : base((InputType)i)
    {
    }
    
        5
  •  1
  •   Pavel Minaev    15 年前

    把任意逻辑放进去 base() 子句而不引入单独的静态方法是使用lambda或匿名委托。里面的表情 基数() 在所有构造函数参数的范围内,因此您可以在lambda内部自由使用它们。例如(假设这是C 2.0,所以没有LINQ可以为同一件事情编写一个单独的行程序):

    class Base
    {
        public Base(int[] xs) {}
    }
    
    class Derived : Base
    {
        public Derived(int first, int last)
            : base(
                ((Func<int[]>)delegate
                {
                    List<int> xs = new List<int>();
                    for (int x = first; x < last; ++x)
                    {
                        xs.Add(x);
                    }
                    return xs.ToArray();
                })())
        {
        }
    }
    

    然而,我强烈建议不要在实践中使用它,因为从可读性的角度来看,这真的很可怕。对于静态方法,您需要显式地向其传递构造函数参数,但通常情况下,这些参数不会超过3-4个。

        6
  •  0
  •   Reed Copsey    15 年前

    不。

    基本构造函数在derivedclass构造函数中的任何逻辑之前运行,因此无法注入逻辑。

    但是,您可以运行基类构造函数,然后在被删除类的构造函数中设置基类中的属性,以便更改值。

        7
  •  0
  •   Ed Swangren    15 年前

    你说

    我意识到,在调用基本构造函数之前,我不能调用派生构造函数。

    但你要出示这个密码

    public DerivedClass(int i)
        : base(value)
    {
        // Is it possible to set "value" here?
        // Logic
    }
    

    当输入该代码块时,基类构造函数已经运行。但是,您可以在将表达式中的值传递给基本构造函数之前对其进行修改(使用一些明显的约束)。但是,除非是构造函数的输入,否则您将无权访问“value”。