hacerca de herencia

19/05/2004 - 20:36 por Owen | Informe spam
Hola:

Yo tengo una clase TestListClass que hereda de ArrayList, pero quiero
sobreescribir los método add la property item. Para que no devuelvan object,
sino TestClass un tipo nuevo. Esto lo hago bien, pero no quiero que cuando
instancie un TestListClass me salga en método add que acepta object, solo el
TestClass. Como puedo hacer esto?

Lo mismo me pasa con la property item.

Agradecido.
Owen.

Preguntas similare

Leer las respuestas

#1 Octavio Hernandez
20/05/2004 - 00:31 | Informe spam
Owen,

No puedes hacerlo, al heredar de ArrayList ya traes toda la funcionalidad de
esa clase a la nueva.
En vez de crear una clase heredera de ArrayList, crea una que no herede de
ella, sino que contenga internamente un campo de ese tipo. Le pones a tu
clase los métods que quieras y los implementas llamando a los
correspondientes de ArrayList.

Slds,

Octavio

"Owen" escribió en el mensaje
news:%
Hola:

Yo tengo una clase TestListClass que hereda de ArrayList, pero quiero
sobreescribir los método add la property item. Para que no devuelvan


object,
sino TestClass un tipo nuevo. Esto lo hago bien, pero no quiero que cuando
instancie un TestListClass me salga en método add que acepta object, solo


el
TestClass. Como puedo hacer esto?

Lo mismo me pasa con la property item.

Agradecido.
Owen.


Respuesta Responder a este mensaje
#2 Tristan
20/05/2004 - 00:45 | Informe spam
Lo que dices no se puede hacer en c#.

Es importante conocer la máxima central de la herencia. Una clase B puede
heredar de otra A, si puede decirse que "todo B es un A". En tu caso,
TestListClass no es un ArrayList puesto que no admite los mismos métodos. Si
no se sigue esa máxima (no siempre MS la sigue), aparecen problemas como el
que muestras, u otros relacionados con el polimorfismo.

En vb.net se puede usar shadows para "esconder" el método Add. En c#, aunque
new produce casi el mismo efecto, no llega a esconder el resto de
sobrecargas (o al menos no conozco la forma). De todas formas sería una
solución chapucera.

Pero existe una clase pensada precisamente para lo que quieres.
CollectionBase es precisamente un ArrayList encapsulado, sin métodos Add ni
indexador. Puedes usarla como base en lugar de ArrayList.

class MiStringList: CollectionBase
{
public void Add(string valor)
{
this.List.Add(valor);
}

public string this[int index]
{
get
{
return (string) this.List[index];
}
set
{
this.List[index] = value;
}
}
}

En un futuro tendremos una solución mejor, los genéricos. Mientras tanto
esta es una buena solución.

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#3 Tristan
20/05/2004 - 00:46 | Informe spam
Aunque como es un caso tan habitual, se ha incluido en el framework una
clase que hace parte del trabajo, CollectionBase.

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#4 Octavio Hernandez
20/05/2004 - 01:56 | Informe spam
¿Qué tal Juan Carlos?

Efectivamente, CollectionBase cumple perfectamente... Yo ni había pensado en
ese uso, veía a CollectionBase como una de los tantos eslabones intermedios
que nunca utilizas. Siempre se aprende algo nuevo.

Aunque está claro que la solución para esto al final son los tipos
genéricos.

Nos vemos,

Octavio

"Tristan" escribió en el mensaje
news:%
Aunque como es un caso tan habitual, se ha incluido en el framework una
clase que hace parte del trabajo, CollectionBase.

Juan Carlos Badiola
MVP - C#


Respuesta Responder a este mensaje
#5 Owen
20/05/2004 - 20:50 | Informe spam
Muchas gracias es exactamente lo que necesito, pero no sabia que podias solo
sobre escribir los metodos Add y this, sino que tenias que hacerlo todo.

saludos y reitero las gracias.
Owen.

"Tristan" wrote in message
news:%
Lo que dices no se puede hacer en c#.

Es importante conocer la máxima central de la herencia. Una clase B puede
heredar de otra A, si puede decirse que "todo B es un A". En tu caso,
TestListClass no es un ArrayList puesto que no admite los mismos métodos.


Si
no se sigue esa máxima (no siempre MS la sigue), aparecen problemas como


el
que muestras, u otros relacionados con el polimorfismo.

En vb.net se puede usar shadows para "esconder" el método Add. En c#,


aunque
new produce casi el mismo efecto, no llega a esconder el resto de
sobrecargas (o al menos no conozco la forma). De todas formas sería una
solución chapucera.

Pero existe una clase pensada precisamente para lo que quieres.
CollectionBase es precisamente un ArrayList encapsulado, sin métodos Add


ni
indexador. Puedes usarla como base en lugar de ArrayList.

class MiStringList: CollectionBase
{
public void Add(string valor)
{
this.List.Add(valor);
}

public string this[int index]
{
get
{
return (string) this.List[index];
}
set
{
this.List[index] = value;
}
}
}

En un futuro tendremos una solución mejor, los genéricos. Mientras tanto
esta es una buena solución.

Juan Carlos Badiola
MVP - C#


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