Tengo dos tipos diferentes de cadenas que estoy pasando y usando en mi código, y las dos están estrechamente relacionadas, pero no deben confundirse entre sí. Pensé que podría ayudarme a evitar errores al tener dos clases que son solo cadenas, pero con nombres diferentes para que las firmas de métodos (y la incompatibilidad de tipos en general) refuercen el significado semántico de los dos tipos diferentes de cadenas. Al mismo tiempo, no quería tener que refactorizar desde something = "foo";
hasta something.Value = "foo";
en cien lugares.¿Cómo puedo declarar las clases de shell derivadas que no hacen más que actuar como cambiar el nombre?
primer pensamiento:
private class FirstKind : string { }
private class SecondKind : string { }
La idea es que si tengo
void MyMethod(FirstKind varOne, SecondKind varTwo) {...}
, y luego tratar de llamarlo con MyMethod(secondKindVar, firstKindVar);
, me gustaría obtener un error de compilación.
Pared I golpe: string
está sellado.
Segundo pensamiento: crea la clase genérica KindOf<T>
que no haría más que asimilar y escupir el valor con operadores de conversión implícitos. De esta manera:
private class KindOf<T>
{
public T Value { get; set; }
public KindOf() { Value = default(T); }
public KindOf(T val) { Value = val; }
public static implicit operator T(KindOf<T> kindOf) { return kindOf.Value; }
public static implicit operator KindOf<T>(T value) { return new KindOf<T>(value); }
}
Esta manera de que pudiera hacer algo como esto:
private class FirstKind : KindOf<string> { }
private class SecondKind : KindOf<string> { }
pared golpeo: nada de la clase KindOf<T>
parece heredar: no existen ni los constructores ni los operadores en los tipos derivados, lo que significa Tengo que volver a implementar esencialmente toda la clase base en las clases derivadas. Copia de código. Yuck.
Así que me siento como si me falta algo básico aquí, y tal vez estoy fuera de las malas hierbas. ¿Alguna idea de lo que intento hacer?
¿Quizás podría aclarar qué significa "dos tipos diferentes de cuerdas"? –
Por encima de todo, tal vez solo necesites implementar los operadores y constructores implícitos en las subclases. Sí, algo así como copiar código, pero al menos no está empleando un proceso complicado o usando herencia cuando la herencia realmente no comunica nada _real_ (retóricamente, ¿qué es un "KindOf" de todos modos y realmente significa algo?) Y es solo para reducir la duplicación de código entre clases que no tienen nada en común además de la sintaxis similar (pero diferentes usos) –
De acuerdo, las clases realmente no deberían estar en la misma jerarquía de herencia, especialmente considerando que no * desea * referirse a ellas por un tipo común, quieres que sigan siendo distintos. – Servy