Necesito una forma de crear una clase estática donde algunas constantes pueden ser específicas de un caso, pero codificadas.clase abstracta estática
Lo que realmente quiero hacer es tener una clase donde se proporcionen varias constantes cuando se amplíe la clase. Quiero que las 'constantes' estén codificadas. Pensé que haría algunas propiedades abstractas y definiría el get {return constant; } al extender la clase.
Sé que no es posible, por lo que ahora estoy frente a dos opciones y me pregunto qué es lo mejor y por qué (si hay opciones que me faltan por favor hágamelo saber!)
- Crear una clase estática con campos anulables y lanzar una excepción si los campos son nulos cuando se llama al método estático.
- Renunciar a la clase estática. Tener una clase no estática con propiedades abstractas y crear una instancia del objeto donde sea que lo necesite aunque toda la funcionalidad sea realmente estática.
Sé que esto podría ser subjetivo y depende de cada caso, sin embargo estoy dando vueltas en círculos al pensar en esto y podría realmente hacer con alguna entrada externa. Eso más, espero que haya algo de lo que quiero y simplemente estoy pensando en esto.
Actualización: Código: Intentaré escribir un código que describa lo que me gustaría lograr. ¡Sé que este código no puede funcionar!
Imagine que la clase abstracta Cálculo está en una DLL, utilizada por muchos proyectos. La funcionalidad es la misma para todos ellos, solo la constante varía de un proyecto a otro.
public abstract static class Calculation
{
private abstract int Constant { get; } //The constant is unknown at this time
public static int Calculate(int inputValue)
{
return inputValue * Constant;
}
}
La clase Calc se define en un proyecto separado donde se necesita la funcionalidad y se conoce la constante.
public static class Calc : Calculation
{
private override int Constant { get { return 2; }
}
...
static class Program
{
[STAThread]
static void Main()
{
//At some point:
int result = Calc.Calculate(6);
}
}
supongo que la forma más sencilla sería la creación de una clase no estática y crear una instancia, sin embargo, me temo que tienen varias instancias de la clase podrían ser costosos y me gustaría evitar que si es posible.
No puedo ver cómo podría escribir esto como un patrón singleton sin escribirlo nuevamente en cada proyecto - teniendo solo la clase anidada en la dll. Eso no impide que el implementador simplemente cree una clase ordinaria y es probable que reinicie el debate para cada proyecto donde se usa el código.
Actualización # 2: Lo que ment con la opción uno es la siguiente:
clase en un DLL:
public static class Calculation
{
public int? Constant {get; set;}
public static int Calculate(int inputValue)
{
if (Constant == null)
throw new ArgumentNullException();
return inputValue * (int)Constant;
}
}
Uso de la función en un proyecto independiente:
static class Program
{
[STAThread]
static void Main()
{
//At some point:
Calculation.Constant = 2;
int result = Calc.Calculate(6);
}
}
La opción uno es muy simple y elegante, lo que me molesta es que nada fuerza el implementador para establecer la constante. Me temo que un escenario (por cierto improbable) donde un caso de esquina oscuro hará que no se establezca la propiedad y que el código falle (y que Constant sea el último sospechoso) ...
¿Por qué cree que necesita una clase estática? ¿Y a qué te refieres con "caso específico, pero codificado"? ¿Podrías publicar un ejemplo concreto? – svick
No puede extender (heredar) una clase estática, entonces, ¿cuál es exactamente su escenario? Un pequeño fragmento de código vale 1000 palabras. –
¿Puede describir el uso de algún código de muestra, posiblemente no compilable? –