Перезаписываемая константа? - PullRequest
0 голосов
/ 05 января 2010

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

СЦЕНАРИЙ

У меня есть формы, которые я отрисовываю в PDF (используя iTextSharp ). В коде все формы сами наследуют базовый класс (OrderForm). В OrderForm есть список констант, которые я использую для измерений при выравнивании объектов для рендеринга PDF, например LEFT_MARGIN и т. Д. Эти константы используются в нескольких функциях, чтобы определить, куда идут вещи.

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

ВЫПУСКА

Вместо создания множества констант для каждого поля, отступов, бла-бла для каждой формы в базовом классе, например: PURCHASE_ORDER_LEFT_MARGIN, INVOICE_LEFT_MARGIN и т. Д., Было бы лучше создать переопределяемый LEFT_MARGIN что может быть установлено в объекте "inheritee" [sic]? Мое рассуждение состоит в том, что является константой, которая не изменится в этом объекте, только формируется, но рендеринг в базовом классе будет оставаться относительно того, чем является эта константа.

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

Спасибо.

Ответы [ 4 ]

5 голосов
/ 05 января 2010

Константы неявно статичны (Shared) .

Вместо этого используйте свойство Readonly *1005*, а затем вы можете переопределить его в любое время и в любом месте.

Быстрый пример ....

Class BaseClass

    ' Assume this field is set with a value from somewhere else'
    Private _leftmargin As Integer

    Overridable Readonly Property LEFT_MARGIN  As Integer
        Get
            Return _leftmargin
        End Get
    End Property
End Class

Class DerivedClass1
    Inherits BaseClass

    Overrides Readonly Property LEFT_MARGIN  As Integer
        Get
            Return 5 'specialized case for this class'
        End Get
    End Property
End Class

Class DerivedClass2
    Inherits BaseClass

    'uses base class LEFT_MARGIN'

End Class
2 голосов
/ 05 января 2010

Константы скомпилированы как буквальные значения. Если у вас этот (C #) исходный код :

public static class MyStringTestClass
{
    // Fields
    public const string ConstString = "Const String";

    public void TestMethod()
    {
        string sc = MyStringTestClass.ConstString;
        SomeOtherFunction(sc);
    }
}

тогда компилятор выдаст это:

public static class MyStringTestClass
{
    // I'm not 100% sure if this declaration is removed as well...
    public const string ConstString = "Const String";

    public void TestMethod()
    {
        // ...but I know for sure that it will be removed
        // everywhere it's used - including other assemblies!
        string sc = "Const String";
        SomeOtherFunction(sc);
    }
}

Как видите, "ConstString" полностью ушел, и его буквальное значение вставлено везде.

Так что используйте VB.net эквивалент виртуального свойства ReadOnly (я думаю, что «виртуальный» называется «Переопределенный» в VB.net?) И переопределите его.

1 голос
/ 05 января 2010

То, что вы хотите, является обычным свойством ... Любое значение, которое изменяется, не является константой ...:)

0 голосов
/ 05 января 2010

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

Класс наследования может предоставить новое значение для «константы» путем переопределения соответствующего метода.

...