也许我应该把它变成一个公共成员,但我一直认为它应该是一个常数。
SCENARIO
我有表格我正在渲染成PDF(使用iTextSharp)。在代码中,表单本身都继承了一个基类(OrderForm
)。在OrderForm
内,有一个常量列表,我在用于对齐PDF渲染的内容时用于测量,例如LEFT_MARGIN
等。这些常量用于多个函数中以确定事物的去向。 / p>
所有表格几乎完全相同,因为它们由相同的组件(标题,地址框,项目等)组成。但是,表格的布局略有不同......在一种形式上,地址框距离右侧一英寸(适合我雇主使用的信封窗口)。
问题
而不是为每个边距创建一系列常量,为基类中的每个表单填充,填充等等,例如:PURCHASE_ORDER_LEFT_MARGIN
,INVOICE_LEFT_MARGIN
等,创建不是更好可以在“inheritee”[sic]对象中设置的可覆盖的LEFT_MARGIN
?我的理由是是一个常量,它不会在该对象内发生变化,只能形成形式,但基类中的渲染将保持相对于常量的任何变化。
我知道我可以简单地创建一个公共成员并设置其价值,但我想知道正确的方法。
感谢。
答案 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)
您可以做的是使用方法而不是常量。在基类中,该方法将返回现在的常量值。
继承类可以通过覆盖相应的方法为“常量”提供新值。