2009-04-20 20 views
27

C#では、定数は派生クラスでオーバーライドできますか?いくつかの定数値が同じバーのグループがあるので、すべてのメソッドを定義したベースクラスを作成し、派生クラスに関連する定数を設定したいと思います。これは可能ですか?C#の派生クラスの定数のオーバーライド

複数のクラスの追加された型安全性を望んでいるので(各定数の異なる2つのオブジェクトが相互作用することは決してないので)、これらの値を各オブジェクトのコンストラクタに渡すだけではありません。

答えて

29

残念ながら、定数は仮想メンバではないためオーバーライドできません。コンパイル時に、コード内の定数識別子はリテラル値に置き換えられます。

私は、あなたがやりたいことに対して抽象または仮想のプロパティを使用することをお勧めします。それらは仮想であり、派生型でオーバーライドできるように(抽象プロパティの場合には)する必要があります。

44

あなたはそれを上書きしたい場合は、それは一定ではありません;))仮想読み取り専用プロパティ(または保護されたセッターをしてみてください...セッター

保護

読み取り専用プロパティ

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と表示されている定数は、コンパイル時にコンパイラによって置換されているものではありません。

しかし、定数値に割り当てられた通常の静的フィールドは、次のようになります。私は今、このようなケースを持っていた:

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

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

私はだけではなく、派生クラスでMaxFactCellフィールドを再定義した場合、多型が機能しません:コードColumnsとして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

この1つは素晴らしいものだろう:) – nayanajith

1

+ Tracker1の答えをDTENをオフに働きたいが、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; } 
    } 
関連する問題