可覆盖的常数?

时间:2010-01-05 05:43:11

标签: asp.net vb.net constants

也许我应该把它变成一个公共成员,但我一直认为它应该是一个常数。

SCENARIO

我有表格我正在渲染成PDF(使用iTextSharp)。在代码中,表单本身都继承了一个基类(OrderForm)。在OrderForm内,有一个常量列表,我在用于对齐PDF渲染的内容时用于测量,例如LEFT_MARGIN等。这些常量用于多个函数中以确定事物的去向。 / p>

所有表格几乎完全相同,因为它们由相同的组件(标题,地址框,项目等)组成。但是,表格的布局略有不同......在一种形式上,地址框距离右侧一英寸(适合我雇主使用的信封窗口)。

问题

而不是为每个边距创建一系列常量,为基类中的每个表单填充,填充等等,例如:PURCHASE_ORDER_LEFT_MARGININVOICE_LEFT_MARGIN等,创建不是更好可以在“inheritee”[sic]对象中设置的可覆盖的LEFT_MARGIN?我的理由是一个常量,它不会在该对象内发生变化,只能形成形式,但基类中的渲染将保持相对于常量的任何变化。

我知道我可以简单地创建一个公共成员并设置其价值,但我想知道正确的方法。

感谢。

4 个答案:

答案 0 :(得分:5)

Constants are implicitly static (Shared)

改为使用只读Property,然后您可以随时随地选择覆盖它。

一个简单的例子......

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

答案 1 :(得分:2)

常量被编译为文字值。如果您有this (C#) source code

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”完全是GONE,它的文字值随处可见。

所以使用VB.net等效的ReadOnly虚拟属性(我认为“虚拟”在VB.net中称为“Overridable”?)并覆盖它。

答案 2 :(得分:1)

你想要的是一个常规属性......任何改变的值都不是常数......:)

答案 3 :(得分:0)

您可以做的是使用方法而不是常量。在基类中,该方法将返回现在的常量值。

继承类可以通过覆盖相应的方法为“常量”提供新值。