2009-04-20 6 views
27

C#에서는 파생 클래스에서 상수를 재정의 할 수 있습니까? 모든 상수 값 막대가 동일한 클래스 그룹을 가지고 있으므로 모든 메서드를 정의한 기본 클래스를 만든 다음 파생 클래스에서 관련 상수를 설정하기 만하면됩니다. 이것이 가능한가? (가 상호 작용하는 다른 상수 두 개체에 대한 의미가 결코 때문에) 나는 여러 클래스의 추가 형식 안전성을 원하는만큼C#에서 파생 클래스의 상수 재정의 C#

차라리 단지 각 개체의 생성자에이 값을 전달하지 않는 게 좋을.

답변

29

불행히도 가상 멤버가 아니기 때문에 상수를 재정의 할 수 없습니다. 컴파일 타임에 코드의 상수 식별자가 리터럴 값으로 대체됩니다.

나는 당신이 당신이하고 싶은 것을 위해 추상 또는 가상 속성을 사용하려고 제안했다. 그것들은 가상이며 파생 된 유형에서 (추상 속성의 경우) 반드시 파기되어야합니다.

44

당신이 그것을 오버라이드 (override) 할 경우는 일정하지의) 가상 읽기 전용 속성 (또는 보호 세터)를 시도 ...

읽기 전용

public class MyClass { 
    public virtual string MyConst { get {return "SOMETHING"; }} 
} 
... 
public class MyDerived : MyClass { 
    public override string MyConst { get { return "SOMETHINGELSE"; }} 
}

재산권

세터

보호
public class MyClass { 
    public string MyConst { get; protected set; } 

    public MyClass() { 
     MyConst = "SOMETHING"; 
    } 
} 

public class MyDerived : MyClass { 
    public MyDerived() { 
     MyConst = "SOMETHING ELSE"; 
    } 
}
3

const으로 표시된 상수는 컴파일 타임에 컴파일러로 대체 될 수 없습니다.

그러나 고정 값에 할당 된 일반 정적 필드는 다음과 같이 할 수 있습니다. 난 그냥 지금 같은 경우 했어 : 난 그냥 대신 파생 클래스에서 MaxFactCell 필드를 재정의하는 경우

class Columns 
    { 
     public static int MaxFactCell = 7; 
    }; 

    class Columns2 : Columns 
    { 
     static Columns2() 
     { 
      MaxFactCell = 13; 
     } 
    }; 

은 다형성은 작동하지 않을 것입니다 : 코드가 최우선 가치를하지 않을 Columns2Columns로를 사용하여.

필드에 대한 쓰기 (읽기가 아닌) 액세스를 제한해야하는 경우 readonly을 사용하면 Columns2에 다시 정의 할 수 없습니다. 이 속성 대신, 즉 약간 더 코드의 확인 :

class Columns 
    { 
     static Columns() 
     { 
      MaxFactCell = 7; 
     }    
     public static int MaxFactCell {get; protected set;}; 
    }; 

    class Columns2 : Columns 
    { 
     static Columns2() 
     { 
      MaxFactCell = 13; 
     } 
    }; 
1

당신은 새로운 일정 new을 선언함으로써 파생 클래스에서 상수 상속 숨길 수 있습니다. 그래도 이것이 좋은 연습인지는 모르겠다.

class A 
{ 
    protected const int MyConst = 1; 
} 

class B : A 
{ 
    new private const int MyConst = 2; 
} 
+0

이 하나는 좋은 일이 될 것입니다 :) – nayanajith

1

dten + Tracker1의 대답을 작동하지만 C#을 업데이트하는 6

public class MyClass { 
    public virtual string MyConst =>"SOMETHING"; 
} 
... 
public class MyDerived : MyClass { 
    public override string MyConst =>"SOMETHING ELSE"; 
} 
0

할 수 있습니다 상수 값 (물론, 읽기 전용 속성)

을 가지고 파생 클래스를 강제로
  • 읽기 전용 속성을 포함하는 인터페이스를 만듭니다.
  • 인터페이스를 기본 클래스에 배치하십시오.

예 :

public interface IHasConstant 
    { 
     string MyConst { get; } 
    } 
관련 문제