2013-01-11 3 views
0

기본 클래스와 하위 클래스에서 사용할 상수를 정의해야합니다. 올바른 정의 방법이 무엇인지 알 수 없습니다.하위 클래스에서도 사용되는 상수를 정의하는 방법은 무엇입니까?

나는 const, readonly, static const와 public, protected, private의 차이점을 알고 있습니다. (C#에서는 "protected"가 거의 사용되지 않습니다.) 이 상수는 어떻게 정의되어야 하는가? 그것들은 public const, public readonly, private constant 또는 private readonly이어야하며, 서브 클래스에 대한 public getter/setter를 사용하거나 보호 된 것으로 정의되어야 하는가?

또 다른 질문은 BaseClass의 변수 FilePath에 관한 것입니다. FilePath는 BaseClass의 일부 함수에서 자리 표시 자로 사용됩니다 (실제 값은 하위 클래스에서 제공됩니다). 가상으로 정의해야합니까?

누군가가 따라야 할 일반적인 규칙을 제공 할 수 있습니까?

public class BaseClass 
{ 
    public const string Country = "USA"; 
    public const string State = "California"; 
    public const string City = "San Francisco"; 

    public virtual string FilePath 
    { 
     get 
     { 
      throw new NotImplementedException(); 
     } 
     set 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

public class Class1 : BaseClass { 

    public Class1() { 
     FilPath = "C:\test"; 
    } 

    public string GetAddress() { 
     return City + ", " + State + ", " + Country; 
    } 

    public void CreateFile() { 
     if (!Directory.Exist(FilePath)) { 
      //create folder, etc 
     } 
    }   
} 
+1

실제로 사용하지 않는 기본 클래스 대신 상수를 실제로 사용하는 하위 클래스를 선언하지 않으시겠습니까? – Krease

+1

또한'public const string Address = City + ","+ State + ","+ Country "를 사용할 수도 있습니다. –

+0

@Chris이 상수는 둘 이상의 하위 클래스에서 사용될 것입니다. 나는 그들을 여러 번 정의하고 싶지 않다. – ericyoung

답변

0

내가 BaseClass로 추상 클래스 (http://msdn.microsoft.com/en-us/library/sf985hc5(v=vs.71).aspx 참조) 할 것 : 다음은 내가 가진 무엇의 예입니다. const와 정적 읽기 전용은 주로 맛의 문제입니다. 당신이 const로 상수를 정의 할 수있는 경우

public abstract class BaseClass 
{ 
    // ... constant definitions 

    // Members that must be implemented by subclasses 
    public abstract string FilePath { get; set; } 
} 
3

다음 그렇게. 가능하지 않다면 static readonly으로 가십시오.

클래스 외부에서 상수를 사용하려면 internal 또는 public이어야합니다. 기본 클래스와 하위 클래스 만 사용한다면 protected으로 만듭니다.

FilePath이 서브 클래스로 제공 될 수있는 경우 virtual이어야합니다. 은 서브 클래스가 제공해야이어야하며 abstract이어야합니다.

+0

"상수가 클래스 외부에서 사용되는 경우 내부 또는 공용이어야합니다." 이것은 나를 혼란스럽게합니다. 그것을 private 속성으로 정의하고 서브 클래스별로 getter를 사용해야합니까? – ericyoung

+0

@ericyoung : 어떻게이 '토론회에'비공개가 되었습니까? 가시성은 여전히 ​​필요한 것을 수행 할 수있는 가장 제한적이어야합니다. 접근 권한을 얻기 위해서는'Class1'이 필요하기 때문에 'private'이 될 수 없기 때문에 최소값은'protected'입니다. 이러한 상수에 접근해야하는 다른 클래스가 있으면'internal'과'public'으로 이동합니다. – Jon

+0

나는 const 필드/속성을 공개하지 않기를 정말로 바란다. 나는 private가 getclass/setter를 서브 클래스에서 사용하도록하는 것이 더 좋을 것이라고 생각했다. 또는 보호 된 것으로 정의 할 수도 있습니다. 그러나 나는 사람들이 보호받는 것을 거의 보지 못했다. 나는 이유를 모른다. – ericyoung

관련 문제