with - const in class c#




Переопределение констант в производных классах в C# (4)

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

  • Создайте интерфейс, содержащий свойство только для чтения.
  • Поместите этот интерфейс в базовый класс.

Пример:

   public interface IHasConstant
   {
        string MyConst { get; }
   }

В C # можно ли переопределить константу в производном классе? У меня есть группа классов, у которых все равно есть некоторые постоянные значения, поэтому я хотел бы создать базовый класс, который определяет все методы, а затем просто устанавливает соответствующие константы в производных классах. Это возможно?

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


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

class A
{
    protected const int MyConst = 1;
}

class B : A
{
    new private const int MyConst = 2;
}

Константы, помеченные как const не могут быть заменены компилятором во время компиляции.

Но регулярные статические поля, присвоенные постоянным значениям, могут. У меня был такой случай только сейчас:

    class Columns
    {
        public static int MaxFactCell = 7;
    };

    class Columns2 : Columns
    {
        static Columns2()
        {
            MaxFactCell = 13;
        }
    };

Если бы я просто переопределил поле MaxFactCell в производном классе вместо этого, полиморфизм не сработал бы: код с использованием Columns2 поскольку Columns не увидели бы переопределяющего значения.

Если вам необходимо ограничить доступ к полю (но не читать), использование readonly запретит его переопределение в Columns2 . Вместо этого сделайте это свойство, это немного больше кода:

    class Columns
    {
        static Columns()
        {
            MaxFactCell = 7;
        }            
        public static int MaxFactCell {get; protected set;};
    };

    class Columns2 : Columns
    {
        static Columns2()
        {
            MaxFactCell = 13;
        }
    };

Отработать ответ dten + Tracker1, но обновлен для c # 6

public class MyClass {
    public virtual string MyConst =>"SOMETHING";
}
...
public class MyDerived : MyClass {
    public override string MyConst  =>"SOMETHING ELSE";
}




constants