Comentario sobre __abstract y __sealed

24/08/2003 - 18:14 por Carlos | Informe spam
Hola a todos

A mi me parece que es un error el que en .Net no se pueda declarar una clase
como __abstract y como __sealed al mismo tiempo

un ejemplo:

Supongamos que tengo una clase A de cuyo tipo no quiero
que se creen objetos, la declaro como __abstract

public __abstract __gc class A
{
/*..*/
};

pero como no puedo declararla __sealed, puede pasar ésto:

public __gc class B : public A
{
};

B* pB = new B;

con lo que tengo un objeto de la clase A aunque con otro nombre de tipo
y me salté el __abstract de la clase A

¿Qué os parece?

Saludos

Preguntas similare

Leer las respuestas

#1 Tomas Restrepo \(MVP\)
24/08/2003 - 20:36 | Informe spam
Hola Carlos,


A mi me parece que es un error el que en .Net no se pueda declarar una


clase
como __abstract y como __sealed al mismo tiempo



Es un detalle que se ha discutido en otras ocaciones con opiniones algo
conflictivas, pero fwiw, opino lo mismo que tu.

Supongamos que tengo una clase A de cuyo tipo no quiero
que se creen objetos, la declaro como __abstract

public __abstract __gc class A
{
/*..*/
};

pero como no puedo declararla __sealed, puede pasar ésto:

public __gc class B : public A
{
};

B* pB = new B;

con lo que tengo un objeto de la clase A aunque con otro nombre de tipo
y me salté el __abstract de la clase A

¿Qué os parece?



Es cierto. Usualmente esto es util para clases que solo contienen miembros
estaticos. En estos casos, el workaround usual es declarar la clase
__sealed, pero con un constructor por defecto privado, lo que hace imposible
crear instancias de la misma (desde fuera de la clase) o derivar clases de
la misma.

Tomas Restrepo

Respuesta Responder a este mensaje
#2 Carlos
27/08/2003 - 00:17 | Informe spam
Hola de nuevo

Esa solución funciona
De todas formas pienso que la mejor forma de declarar una clase como
abstracta es la
tradicional del C++, declarar al menos una función virtual pura

Y es que el problema está en que una clase derivada de otra declarada como
__abstract
ya no es abstracta, y una clase derivada de otra con una función virtual
pura también es
abstracta ( al menos por defecto, hasta que se defina la función). Y si la
función virtual pura es privada, será algo más dificil que deje de ser
abstracta.

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