2009-07-10 2 views
5

그래, 나는 이것이 약간 엉성한 것을 인정한다. 그러나 그것은 논리적 인 목적을 제공한다. 현재 프로젝트에서 C#을 사용하고 있으며 파생 클래스에서 멤버 변수를 재정의하는 방법을 찾고 있지만 기본 클래스 메서드에서 재정의 된 변수에 액세스하려고합니다. 더 "재미있는"것들을 만들기 위해서는 재정의 된 멤버 변수가 정적 인 것이 바람직합니다 (아래 예제 코드에는 표시되지 않음). 문제가 해결되지 않는 이유에C# 기본 변수 메서드에 의해 사용 된 멤버 변수 재정의

class baseclass 
{ 
    protected string[] array = null; 

    public string method() 
    { 
     string str = ""; 
     foreach (string x in this.array) 
     { 
      str += x + " "; 
     } 

     return str; 
    } 
} 

class subclass1 : baseclass 
{ 
    new string[] array = new string[] 
    { 
     "class1value1", 
     "class1value2", 
     "class1value3", 
     "class1value4" 
    }; 
} 

class subclass2 : baseclass 
{ 
    new string[] array = new string[] 
    { 
     "class2value1", 
     "class2value2", 
     "class2value3", 
     "class2value4" 
    }; 
} 

어떤 생각과 주위에 얻을 수있는 방법 : 여기

내 샘플 코드인가?

+1

멤버 변수는 메소드와 같은 다형성이 아닙니다. 각 서브 클래스에 원하는 값을 포함하도록 배열을 초기화하십시오. –

답변

8

가상 속성을 사용할 수없는 이유가 있습니까? 그것은 당신이 찾고있는 기능을 정확하게 제공 할 것입니다. 그것은 단지 분야가 아닐 것입니다.

protected abstract string[] array { get; } 

...

protected override string[] array { get { return new string[]{"...","..."}; }} 
+0

나는 지금 당장 이걸 가지고 놀고있어 ... 네가 맞을지도 모른다. 내 생각에 자신감을 더해 주셔서 감사합니다. –

1

왜 변수를 재정의해야합니까? 코드를 살펴보면 값을 설정하는 것만으로 충분합니다.

게다가 정적 변수는 인스턴스가 아닌 클래스에 연결되므로 어떤 상황에서도 무시할 수 없습니다.

+0

다른 데이터를 보유하기 위해 별도의 클래스를 만드는 중 +1 –

1

간단하게 새로운 사용하지 마십시오. 서브 클래스의 생성자에 배열을 설정하십시오.

편집 : 코드 :

class subclass1 : baseclass 
{ 
    public subclass1() 
    { 
     array = new string[] 
     { 
      "class1value1", 
      "class1value2", 
      "class1value3", 
      "class1value4" 
     }; 
    } 
} 

class subclass2 : baseclass 
{ 
    public subclass2() 
    { 
     array = new string[] 
     { 
      "class2value1", 
      "class2value2", 
      "class2value3", 
      "class2value4" 
     }; 
    } 
} 
+0

이렇게하면 정적 배열을 가질 수 없습니다. –

1
class BaseClass 
{ 
    public virtual string Method() 
    { 
     return string.Empty; 
    } 
} 

abstract class BaseClass<T> : BaseClass where T : BaseClass<T> 
{ 
    protected static string[] strings; 

    public override string Method() 
    { 
     return string.Join(" ", strings); 
    } 
} 

class Subclass1 : BaseClass<Subclass1> 
{ 
    static Subclass1() 
    { 
     strings = new[] { "class1value1", "class1value2", "class1value3" }; 
    } 
} 

class Subclass2 : BaseClass<Subclass2> 
{ 
    static Subclass2() 
    { 
     strings = new[] { "class2value1", "class2value2", "class2value3" }; 
    } 
} 

중요한 부분은 일반 매개 변수 T있는 문자열 배열에 대한 인덱스로 기본적으로있는 기능.

1

배열에서 다형성 동작을 얻으려고하고 있지만 클래스 로컬 동작을 위해이를 정의하고 있습니다.

배열은 항상 기본 클래스의 배열에의 액세스 컴파일 가상 또는 기본 클래스 메서드()이어야한다 - 배열은 또한 속성이 아닙니다이 할 수있는 분야, 즉해야

string [] _array = {...};/기본 클래스 로컬 값 protected virtual string [] array {get {return _array; }} //은 재정의 배열 속성을 만드는

후, 서브 클래스에서, 당신이해야합니다

문자열 [] _array = {...}; // 서브 클래스 로컬 값 가상 문자열 [] array {get {return _array; }} // 기본 클래스 속성을 덮어 씁니다.