Присвоение статическому полю только для чтения базового класса

Я все еще пишу код для систем, которые не имеют поддержки с плавающей точкой в аппаратных средствах. В этих системах Вам нужно смещение бита почти для всей Вашей арифметики.

Также Вам нужны сдвиги для генерации хешей. Полиномиальная арифметика (CRC, Коды Тростника-Solomon являются основными приложениями), или сдвиги использования также.

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

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

9
задан BoltClock 16 December 2011 в 16:29
поделиться

3 ответа

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

Предположим, у вас есть другой класс, производный от ClassC, который делает то же самое - вы в конечном итоге перезаписываете переменную, которая является предназначен только для чтения. Здесь есть единственная статическая переменная, однако у вас есть много производных классов.

Один из ответов - избегать использования статической переменной , но поместить виртуальное свойство ] в базовом классе и заставит каждый производный класс переопределять свойство для возврата другой константы:

public class ClassA
{
    public virtual string ProcessName { get { return "ClassAProcess"; } }
} 

public class ClassB : ClassA
{
    public override string ProcessName { get { return "MyProcess.exe"; } }
}

В основном вариант состоит в том, чтобы отделить «статический»

15
ответ дан 4 December 2019 в 10:05
поделиться

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

static class ProcessNames<T> {
   public static string Value { get; set; }
}

, и использовании вместо него ProcessNames .Value . Очевидно, что таким образом значение будет общедоступным.

Однако вы должны увидеть, соответствует ли определение поля в каждом производном классе отдельно вашим потребностям, и прибегать к обходным путям, только если это не так.

5
ответ дан 4 December 2019 в 10:05
поделиться

Есть много способов снять шкуру с кошки. Вот еще один способ сделать это.

public class ClassA
{
    public string ProcessName{ get; private set;}

    public ClassA()
    {
        ProcessName = "ClassAProcess";
    }

    public ClassA(string processName)
    {
        ProcessName = processName;
    }
}

public class ClassB : ClassA
{
    public ClassB() : base("ClassAProcess")
    {
    }
}
1
ответ дан 4 December 2019 в 10:05
поделиться
Другие вопросы по тегам:

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