2011-05-01 4 views
34

static 필드가있는 경우 abstract 기본 클래스에서 어떤 일이 발생합니까?기본 클래스 및 파생 클래스의 정적 필드

범위가이 기본 클래스에서 상속하는 클래스 또는 상속되는 형식 (각 하위 클래스에는 abstract 기본 클래스의 static 필드의 자체 복사본이 있습니다)입니까?

+0

BTW, 사실; 기본 클래스가'abstract'인지 아닌지는 중요하지 않습니다. @Marc Gravell이 지적한 행동은 같습니다. – casperOne

+0

@casperOne : 우리가'TypeLocal '과 같은 것을 찾고 있는데,'ThreadLocal '입니다. 그래서 그 유형의 객체는 해당'subclass'에'static'이 될 것입니다. – Xaqron

답변

54

static 회원 클래스를 선언 전적으로 특정; 서브 클래스는 별도의 사본을 갖지 않습니다. 유일한 예외는 generics입니다. 열려있는 제네릭 유형이 정적 필드를 선언하면 해당 필드는 닫힌 제네릭 유형을 구성하는 인수 유형이 조합과 일치합니다. 즉 Foo<int>Foo<T>에 필드가 정의되어 있다고 가정 할 때 Foo<string>으로 별도의 정적 필드를 갖습니다.

+0

@Marc Gravell : 유감스러운 남자, 너와 @ 존 스키켓은 내게 현학적 인 가르침을 주었다. 당신은 "정적 인수"와 반대로 "유형 인수"를 말하려고했습니다. =) 모든 것이 연못을 가로 질러 잘지기를 바랍니다. – casperOne

+2

'기본 클래스'의 모든 인스턴스 (유형별)에 대해 고유 한 변수를 선언하는 방법은 무엇입니까? – Xaqron

+0

@Xaqron : 당신은 각 파생 클래스에서 원하는 정적 멤버를 재 선언해야 할 수 없습니다. – casperOne

8

다른 답변에서 지적한 것처럼 기본 클래스 정적 필드는 모든 하위 클래스에서 공유됩니다. 각 최종 서브 클래스에 대한 별도의 사본이 필요하면 키로 서브 클래스 이름으로 정적 사전을 사용할 수 있습니다 : 기본 클래스 abstract` 붉은 청어입니다 '라고

class Base 
{ 
    private static Dictionary<string, int> myStaticFieldDict = new Dictionary<string, int>(); 

    public int MyStaticField 
    { 
     get 
     { 
      return myStaticFieldDict.ContainsKey(this.GetType().Name) 
        ? myStaticFieldDict[this.GetType().Name] 
        : default(int); 
     } 

     set 
     { 
      myStaticFieldDict[this.GetType().Name] = value; 
     } 
    } 

    void MyMethod() 
    { 
     MyStaticField = 42; 
    } 
} 
관련 문제