2009-04-20 8 views
27

In C# kann eine Konstante in einer abgeleiteten Klasse außer Kraft gesetzt werden? Ich habe eine Gruppe von Klassen, die alle gleich sind bar einige konstante Werte, also möchte ich eine Basisklasse erstellen, die alle Methoden definiert und dann nur die relevanten Konstanten in den abgeleiteten Klassen festlegen. Ist das möglich?Überschreiben von Konstanten in abgeleiteten Klassen in C#

Ich möchte diese Werte nicht einfach an den Konstruktor jedes Objekts übergeben, da ich gerne die Typsicherheit mehrerer Klassen hätte (da es nie Sinn macht, wenn zwei Objekte mit unterschiedlichen Konstanten interagieren).

Antwort

29

Leider können Konstanten nicht überschrieben werden, da sie keine virtuellen Member sind. Konstante Bezeichner in Ihrem Code werden beim Kompilieren vom Compiler durch ihre Literalwerte ersetzt.

Ich würde vorschlagen, Sie versuchen, eine abstrakte oder virtuelle Eigenschaft für das, was Sie tun möchten, zu verwenden. Diese sind virtuell und können (im Falle einer abstrakten Eigenschaft) im abgeleiteten Typ überschrieben werden.

44

es ist keine Konstante, wenn Sie es außer Kraft setzen wollen;) eine virtuelle schreibgeschützte Eigenschaft versuchen (oder geschützten Setter) ...

Read-Only Property

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

Protected Setter

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

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

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

Mit const markierte Konstanten können nicht wie sie durch den Compiler zur Kompilierzeit ersetzt werden.

Aber regelmäßige statische Felder, die konstanten Werten zugewiesen werden können. Ich habe gerade jetzt einen solchen Fall hatte:

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

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

Wenn ich nur MaxFactCell Feld in der abgeleiteten Klasse statt neu definiert, Polymorphismus nicht funktionieren würde: Code Columns2 als Columns würde den zwingenden Wert nicht sehen.

Wenn Sie den Schreibzugriff auf das Feld beschränken (aber nicht lesen) müssen, würde die Verwendung von readonly die Neudefinition in Columns2 verhindern. Machen Sie es eine Eigenschaft statt, das ist etwas mehr Code:

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

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

Sie die Konstante in einer abgeleiteten Klasse geerbt verstecken kann durch die neue Konstante new erklärt. Ich bin mir nicht sicher, ob das eine gute Übung ist.

class A 
{ 
    protected const int MyConst = 1; 
} 

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

Dies wäre ein schöner sein :) – nayanajith

1

abarbeiten DTEN + Tracker1 Antwort aber für C# 6

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

Sie aktualisiert können abgeleitete Klassen zwingen, einen Wert für eine Konstante haben (na ja, eine schreibgeschützte Eigenschaft)

  • Erstellen Sie eine Schnittstelle mit einer schreibgeschützten Eigenschaft.
  • Setzen Sie diese Schnittstelle auf die Basisklasse.

Beispiel:

public interface IHasConstant 
    { 
     string MyConst { get; } 
    } 
Verwandte Themen