문제

public class ClassA
{
    public static readonly string processName;
} 

public class ClassB : ClassA
{
    static ClassB()
    {
        processName = "MyProcess.exe";
    }
}

위의 C# 코드를 컴파일하는 동안 오류가 발생합니다.

오류는 "정적 재조정 필드를 할당 할 수 없습니다 (정적 생성자 또는 가변 초기화 제외).

그러나 정적 생성자에 할당하고 있습니다.

이러한 정적 변수의 필요성은 기본 클래스 에이 변수를 사용하는 방법이 있지만 파생 클래스와 기본 클래스는이 변수에 대해 다른 값을 가져야한다는 것입니다. 그러나 값은 각 클래스의 모든 인스턴스에서 일정합니다. 어디서나 변경해서는 안되기 때문에 준비되어 있어야합니다.

위 코드의 오류는 무엇입니까? (있는 경우) 나는 하나를 발견 할 수없는 것 같습니다. 오류 메시지가 도움이되지 않습니다. 나는 그것에 따라 잘못한 일을하지 않기 때문에.

오류가있는 경우 어떻게이 기능을 구현할 수 있습니까? 간단한 해결 방법은 인스턴스 변수로 만들고 파생 클래스에서 다른 값을 할당하는 것입니다. 그러나 각 클래스의 모든 사례에 걸쳐 가치가 일정하므로 불필요합니다.

도움이 되었습니까?

해결책

당신은 잘못된 그래도 정적 생성자. 정적 생성자에만 할당 할 수 있습니다 변수를 선언하는 유형의 경우.

Classc에서 유래 한 다른 클래스가 같은 일을한다고 가정 해 봅시다. 결국 변수를 덮어 쓰는 것이 좋습니다. 거기에 하나의 정적 변수는 여기에 있지만 많은 파생 클래스가 있습니다.

한 가지 대답은 정적을 사용하지 않는 것입니다 변하기 쉬운 그러나 가상을 넣으십시오 재산 기본 클래스에서, 각 파생 클래스가 속성을 무시하여 다른 상수를 반환합니다.

public class ClassA
{
    public virtual string ProcessName { get { return "ClassAProcess"; } }
} 

public class ClassB : ClassA
{
    public override string ProcessName { get { return "MyProcess.exe"; } }
}

기본적으로 옵션은 "정적"비트를 별도의 계층 구조로 분리하는 것입니다. 효과적으로 인스턴스 대신 유형보다 다형성을 원하는 것처럼 들리며 .NET에서는 지원되지 않습니다.

다른 팁

예에서는 단일 필드 만 존재하고 기본 클래스의 필드 만 존재하며 단일 필드에서는 다른 값을 가질 수 없습니다. 그 외에도 초기화 만 할 수 있습니다 readonly 파생 수업이 아닌 동일한 클래스의 필드. 해결 방법은 다음과 같은 일반적인 클래스를 정의 할 수 있습니다.

static class ProcessNames<T> {
   public static string Value { get; set; }
}

그리고 사용 ProcessNames<DerivedClassType>.Value 대신에. 분명히, 값은 이런 식으로 공개적으로 액세스 할 수 있습니다.

그러나 각 파생 클래스에서 필드를 정의하는 것이 필요에 맞는 경우에만 적합하고 그렇지 않은 경우 해결 방법에만 의지하는지 확인해야합니다.

고양이를 피부하는 방법에는 여러 가지가 있습니다. 다음은 할 수있는 또 다른 방법이 있습니다.

public class ClassA
{
    public string ProcessName{ get; private set;}

    public ClassA()
    {
        ProcessName = "ClassAProcess";
    }

    public ClassA(string processName)
    {
        ProcessName = processName;
    }
}

public class ClassB : ClassA
{
    public ClassB() : base("ClassAProcess")
    {
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top