typedef

27/05/2004 - 18:46 por Javier M Mora | Informe spam
Por dar limpieza y claridad a mi código, pretendo añadir alias de tipos
y además así que el compilador me haga comprobación estática de tipos.
Me explico:

Tengo variables int que (por ejemplo) representan metros y otras que
representan segundos. Lo que quiero es que el compilador proteste si en
algún caso sumo metros con segundos (aunque no es un error de sintaxis
del programa porque ambos son enteros si sería un error en la lógica del
programa).

En C++ se podía hacer con typedef. He visto que en C# no existe dicho
procedimiento. Así que se me ocurrió hacer algo como esto:

class Metros: System.Int32 {}
class Segundos: System.Int32 {}

Para crear 2 clases que aunque tengan el mismo contenido no pueden ser
sumadas por que no tienen el operador + sobrecargado. Pero el compilador
se queja porque no se pueden derivar clases de System.Int32:

error CS0509: class `Metros': Cannot inherit from sealed class
`System.Int32' (a class can not inherit from a struct/enum)

¿Existe alguna forma de hacer esta comprobación estática de tipos?
(Además de hacer dos clases/estructuras completas, que me parece un
despilfarro:

struct Metros { int valor }
struct Segundos { int valor }
)

Quizás estoy pensando aún con el chip de C++. Si esto no se puede hacer
en C# ¿cómo sería la forma más apropiada de hacerlo?

Javier Maria Mora Merchan
(GPGP) Key ID: 0x794F3D83

Preguntas similare

Leer las respuestas

#1 Francisco García
27/05/2004 - 20:17 | Informe spam
Puedes usar el operador typeof para conocer el objeto System.Type.
Tambien puedes usar el metodo GetType() para obtener el tipo.
ejemplo:
if( txtbox1.GetType() == typeof(TextBox))
txtbox1.Text = txtbox1.GetType().ToString();

Int32 es una enumeracion por eso no la heredas.

"Javier M Mora" escribió en el mensaje
news:
Por dar limpieza y claridad a mi código, pretendo añadir alias de tipos
y además así que el compilador me haga comprobación estática de tipos.
Me explico:

Tengo variables int que (por ejemplo) representan metros y otras que
representan segundos. Lo que quiero es que el compilador proteste si en
algún caso sumo metros con segundos (aunque no es un error de sintaxis
del programa porque ambos son enteros si sería un error en la lógica del
programa).

En C++ se podía hacer con typedef. He visto que en C# no existe dicho
procedimiento. Así que se me ocurrió hacer algo como esto:

class Metros: System.Int32 {}
class Segundos: System.Int32 {}

Para crear 2 clases que aunque tengan el mismo contenido no pueden ser
sumadas por que no tienen el operador + sobrecargado. Pero el compilador
se queja porque no se pueden derivar clases de System.Int32:

error CS0509: class `Metros': Cannot inherit from sealed class
`System.Int32' (a class can not inherit from a struct/enum)

¿Existe alguna forma de hacer esta comprobación estática de tipos?
(Además de hacer dos clases/estructuras completas, que me parece un
despilfarro:

struct Metros { int valor }
struct Segundos { int valor }
)

Quizás estoy pensando aún con el chip de C++. Si esto no se puede hacer
en C# ¿cómo sería la forma más apropiada de hacerlo?

Javier Maria Mora Merchan
(GPGP) Key ID: 0x794F3D83


Respuesta Responder a este mensaje
#2 Octavio Hernandez
27/05/2004 - 22:56 | Informe spam
Javier,

Efectivamente, la manera de hacerlo sería mediante un struct. Por supuesto,
tendrías que agregarle a la clase todos los operadores, funciones, etc. que
quisieras poder aplicar a los 'Metros' o 'Segundos'. Te mando un pequeño
ejemplo.

La gran ventaja de usar 'struct' en vez de 'class' es que el tipo que se
obtiene es un tipo-valor, y se podrá operar sobre él con mucho más
eficiencia.
public struct Metros { // definición del tipo

private int n;

public Metros(int k) { n = k; }

public static implicit operator Metros(int k) { return new Metros(k); }

public static Metros operator + (Metros m1, Metros m2) { return new
Metros(m1.n + m2.n); }

public override string ToString() { return n.ToString(); }

}


private void button2_Click(object sender, System.EventArgs e)

{

Metros m1 = new Metros(5); // llamada al constructor

Metros m2 = 7; // operador de conversión implícito

Metros m3 = m1 + m2; // operador '+'

MessageBox.Show(m3.ToString());

}

Con esta definición de clase, los 'Metros' no se podrán mezclar con los
'Segundos' ni con los enteros genéricos, cosa que sí podría suceder en C++,
porque sabes que 'typedef' en el fondo no define un tipo, sino solo un
alias.

Salu2,

Octavio

"Javier M Mora" escribió en el mensaje
news:
Por dar limpieza y claridad a mi código, pretendo añadir alias de tipos
y además así que el compilador me haga comprobación estática de tipos.
Me explico:

Tengo variables int que (por ejemplo) representan metros y otras que
representan segundos. Lo que quiero es que el compilador proteste si en
algún caso sumo metros con segundos (aunque no es un error de sintaxis
del programa porque ambos son enteros si sería un error en la lógica del
programa).

En C++ se podía hacer con typedef. He visto que en C# no existe dicho
procedimiento. Así que se me ocurrió hacer algo como esto:

class Metros: System.Int32 {}
class Segundos: System.Int32 {}

Para crear 2 clases que aunque tengan el mismo contenido no pueden ser
sumadas por que no tienen el operador + sobrecargado. Pero el compilador
se queja porque no se pueden derivar clases de System.Int32:

error CS0509: class `Metros': Cannot inherit from sealed class
`System.Int32' (a class can not inherit from a struct/enum)

¿Existe alguna forma de hacer esta comprobación estática de tipos?
(Además de hacer dos clases/estructuras completas, que me parece un
despilfarro:

struct Metros { int valor }
struct Segundos { int valor }
)

Quizás estoy pensando aún con el chip de C++. Si esto no se puede hacer
en C# ¿cómo sería la forma más apropiada de hacerlo?

Javier Maria Mora Merchan
(GPGP) Key ID: 0x794F3D83


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida