Изменение значений параметров прежде, чем отправить Основному конструктору

System.String строковый класс.NET - в C# string, псевдоним для System.String - таким образом используемый, они - то же.

Что касается инструкций я не слишком сорвать и просто использовать, какой бы ни Вы чувствуете себя подобно - существуют более важные вещи в жизни, и код будет тем же так или иначе.

, Если Вы создаете системы, где необходимо определить размер целых чисел, Вы используете и так будьте склонны использовать Int16, Int32, UInt16, UInt32 и т.д. тогда могло бы выглядеть более естественным использовать String - и при перемещении между различными .net языками, это могло бы сделать вещи более понятными - иначе я буду использовать строку и интервал

30
задан Sнаđошƒаӽ 30 January 2017 в 06:51
поделиться

7 ответов

Я ожидаю, что вы можете вызывать статические методы в списке параметров конструктора базового класса.

public class DerivedClass : BaseClass
{
    public DerivedClass(int i)
        : base(ChooseInputType(i))
    {
    }

    private static InputType ChooseInputType(int i)
    {
        // Logic
        return InputType.Number;
    }
}
50
ответ дан 27 November 2019 в 23:43
поделиться

Вы можете создать статический метод в производном классе и поместите туда свою логику:

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);
    }
}
3
ответ дан 27 November 2019 в 23:43
поделиться

Вы можете использовать статический метод для вычисления значения, которое будет передаваться базовому конструктору.

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
    }
}
5
ответ дан 27 November 2019 в 23:43
поделиться

Да. Можно использовать обычные выражения, которые не обращаются к экземпляру, для управления значением. Например,

public DerivedClass(int i)
    : base((InputType)i)
{
}
2
ответ дан 27 November 2019 в 23:43
поделиться

Один из способов поместить произвольную логику в предложение base () без введения отдельного статического метода - это использовать лямбда-выражение или анонимный делегат. Выражение внутри base () входит в область видимости всех параметров конструктора, поэтому вы можете свободно использовать их внутри лямбда-выражения. Например (скажем, это 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.

1
ответ дан 27 November 2019 в 23:43
поделиться

Нет.

Базовый конструктор запускается до любой логики в конструкторе DerivedClass, поэтому нет возможности внедрить логику.

Вы можете,

0
ответ дан 27 November 2019 в 23:43
поделиться

Вы говорите

Я понимаю, что не могу вызовите производный конструктор перед вызовом базового конструктора

Но затем вы покажете этот код

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

Когда этот кодовый блок введен, вы уже запустили конструктор базового класса. Однако вы можете изменить значение в выражении перед передачей его базовому конструктору (с некоторыми очевидными ограничениями). Однако у вас не будет доступа к «значению», если оно не является входом в конструктор.

0
ответ дан 27 November 2019 в 23:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: