2009-04-20 11 views
27

In C# è possibile sovrascrivere una costante in una classe derivata? Ho un gruppo di classi che sono tutti la stessa barra di alcuni valori costanti, quindi mi piacerebbe creare una classe base che definisce tutti i metodi e quindi basta impostare le costanti rilevanti nelle classi derivate. È possibile?Sovrascrivere le costanti nelle classi derivate in C#

Preferisco non solo passare questi valori al costruttore di ogni oggetto come vorrei aggiungere la sicurezza del tipo di più classi (poiché non ha mai senso che due oggetti con costanti diverse interagiscano).

risposta

29

Purtroppo le costanti non possono essere sovrascritte in quanto non sono membri virtuali. Gli identificatori costanti nel tuo codice vengono sostituiti con i loro valori letterali dal compilatore in fase di compilazione.

Ti suggerirei di provare a utilizzare una proprietà astratta o virtuale per quello che vorresti fare. Quelli sono virtuali e come tali possono (devono, nel caso di una proprietà astratta) essere sovrascritti nel tipo derivato.

44

non è una costante, se si desidera sovrascrivere esso;) provare una proprietà di sola lettura virtuale (o setter protetto) ...

proprietà di sola lettura

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

Protetta Setter

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

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

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

Le costanti contrassegnate con const non possono essere sostituite dal compilatore in fase di compilazione.

Ma i campi statici regolari assegnati a valori costanti possono. Ho avuto un caso del genere in questo momento:

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

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

Se ho appena ridefinito MaxFactCell campo nella classe derivata, invece, il polimorfismo non avrebbe funzionato: codice utilizzando Columns2 come Columns non avrebbe visto il valore prioritario.

Se è necessario limitare l'accesso in scrittura (ma non la lettura) al campo, l'utilizzo di readonly vieterebbe la ridefinizione in Columns2. Ne fanno una proprietà, invece, che è un po 'più di codice:

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

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

È possibile nascondere la costante ereditato in una classe derivata dichiarando la nuova costante new. Non sono sicuro che sia una buona pratica, comunque.

class A 
{ 
    protected const int MyConst = 1; 
} 

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

questo sarebbe una bella :) – nayanajith

1

per lavorare fuori dten + risposta di Tracker1 ma aggiornato per C# 6

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

è possibile forzare classi derivate di avere un valore per una costante (beh, una proprietà di sola lettura)

  • Creare un'interfaccia contenente una proprietà di sola lettura.
  • Metti l'interfaccia sulla classe base.

Esempio:

public interface IHasConstant 
    { 
     string MyConst { get; } 
    } 
Problemi correlati