2010-01-05 1 views
0

어쩌면 이걸 공개 회원으로 만들어야 하겠지만, 나는 그것이 상수라고 생각하고 있습니다.재정의 가능한 상수?

시나리오는 내가 (iTextSharp 사용) 나 PDF 파일로 렌더링하고있어 형태를 가지고있다. 코드에서 폼 자체는 모두 기본 클래스 (OrderForm)를 상속합니다. OrderForm에는 LEFT_MARGIN 등과 같이 PDF 렌더링을 위해 정렬 할 때 측정에 사용하는 상수 목록이 있습니다.이 상수는 여러 기능에서 사용되는 위치를 결정하는 데 사용됩니다.

모든 양식은 동일한 구성 요소 (머리글, 주소 상자, 항목 등)로 구성되므로 사실상 동일합니다. 그러나 양식의 레이아웃은 약간 다릅니다 ... 한 가지 양식에서 주소 상자는 오른쪽으로 조금 더 (고용주가 사용하는 봉투 창에 맞게) 있습니다.

문제가

각 마진, 패딩, 기본 클래스의 각 양식에 대한 저쩌구, 예를 들어, 상수의 슬루 만들보다는 : PURCHASE_ORDER_LEFT_MARGIN, INVOICE_LEFT_MARGIN을, 등, 더 나은되지 않을 것 것은 만들 "inheritee"[sic] 객체에서 설정할 수있는 오버라이드 가능한 LEFT_MARGIN? 내 추론은 이며 그 개체 내에서 변경되지 않는 상수이며 양식으로 만 양식이되지만 기본 클래스의 렌더링은 상수와 관계없이 그대로 유지됩니다.

나는 public 멤버를 만들고 값을 설정할 수 있음을 알고 있지만 이것에 대해 올바른 방법을 알고 싶습니다.

감사합니다.

답변

5

Constants are implicitly static (Shared).

대신 Readonly 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 
+0

hm ..이런 생각이 듭니다. – Jason

+0

이 솔루션으로 끝났습니다. 감사! – Jason

1

당신이 원하는 것은 일반 속성입니다 ... 변화에는 어떤 값 ... 당신이 할 수있는 일 :

+1

그건 문질러 야 ... 난 그걸 바꾸고 싶지 않아. 마찬가지로 개체를 선언 할 때 수정할 수 없습니다. – Jason

+0

속성에 'get'만 정의하고이를 생성자에서만 직접 설정할 수 있습니다 (직접 변수를 통해). .NET에서 생성자가 호출 될 때까지 const 변수의 설정을 그대로 유지할 수 있는지 기억하지 못합니다. (정적 변수이기 때문에 의심 스럽습니다. Java는 이것을 수행 할 수있는 'final' 변수를가집니다). 어쨌든 제가 제안한 첫 번째 방법이 효과가 있습니다. –

0

가 일정한 아니다 상수 대신에 메쏘드를 사용한다. 기본 클래스에서 메서드는 상수의 값을 그대로 반환합니다.

상속 클래스는 해당 메서드를 재정 의하여 "상수"에 대한 새 값을 제공 할 수 있습니다.

2

상수는 리터럴 값으로 컴파일됩니다. 당신이 this (C#) source code가있는 경우 :

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는"완전히 사라과 리터럴 값이 사방에 삽입되어있다 :
public static class MyStringTestClass 
{ 
    // Fields 
    public const string ConstString = "Const String"; 

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

다음 컴파일러는이를 생성합니다.

ReadOnly 가상 속성에 해당하는 VB.net을 사용하십시오 ("가상"은 VB.net에서 "재정의 가능"이라고 생각하십니까?).

+0

이것은 흥미 롭습니다. 나는 이것을 몰랐다. 나는 그 때 그것을 할 수 없다는 것을 이해한다. – Jason