2009-04-20 17 views
27

En C# ¿puede anularse una constante en una clase derivada? Tengo un grupo de clases que son todas iguales en algunos valores constantes, por lo que me gustaría crear una clase base que defina todos los métodos y luego simplemente establecer las constantes relevantes en las clases derivadas. es posible?Anulando constantes en las clases derivadas en C#

Prefiero no solo pasar estos valores al constructor de cada objeto, ya que me gustaría la seguridad de tipo adicional de varias clases (ya que nunca tiene sentido que interactúen dos objetos con constantes diferentes).

Respuesta

29

Desafortunadamente, las constantes no pueden anularse ya que no son miembros virtuales. Los identificadores constantes en su código son reemplazados por sus valores literales por el compilador en tiempo de compilación.

Le sugiero que intente utilizar una propiedad abstracta o virtual para lo que le gustaría hacer. Esos son virtuales y, como tales, pueden (deben, en el caso de una propiedad abstracta) anularse en el tipo derivado.

44

no es una constante si quiere anularlo;) probar una propiedad de sólo lectura virtual (o colocador protegido) ...

propiedad de sólo lectura

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

Protegida Setter

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

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

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

Las constantes marcadas con const no pueden, ya que son sustituidas por el compilador en tiempo de compilación.

Pero los campos estáticos regulares asignados a valores constantes pueden. He tenido un caso así en este momento:

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

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

Si tan sólo redefinido MaxFactCell campo en la clase derivada lugar, el polimorfismo no funcionaría: código usando Columns2 como Columns no ver el valor primordial.

Si necesita restringir el acceso de escritura (pero no de lectura) al campo, usar readonly prohibiría redefinirlo en Columns2. Que sea una propiedad en lugar, que sea un poco más código:

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

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

puede ocultar la heredó constante en una clase derivada declarando la nueva constante new. Aunque no estoy seguro de que esta sea una buena práctica.

class A 
{ 
    protected const int MyConst = 1; 
} 

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

ésta sería una agradable :) – nayanajith

1

para trabajar fuera DTEN + respuesta de Tracker1 pero actualizado para C# 6

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

Puede forzar las clases derivadas de tener un valor de una constante (bueno, una propiedad de sólo lectura)

  • Crea una interfaz que contiene una propiedad de solo lectura.
  • Pon esa interfaz en la clase base.

Ejemplo:

public interface IHasConstant 
    { 
     string MyConst { get; } 
    } 
Cuestiones relacionadas