martes, 29 de abril de 2014

Restricciones sobre los Modificadores de Acceso en C#

Tabla de Contenido

0. Introducción
1. Restricción en Jerarquía de Herencia
2. Inconsistencias de Accesibilidad
3. Conclusiones
4. Glosario
5. Enlaces & Literatura

0. Introducción

En artículos previos -Modificadores de Acceso en C#, Friend Assemblies en C#, y Superposicion de Modificadores de Acceso en C#- hemos visto varias de las propiedades y funcionalidades de los modificadores de acceso en C#; y en este artículo vamos a incluir otro concepto relacionado con el grado de acceso de un modificador. Veremos que esto es importante en la jerarquía de herencia de tipos.

1. Restricción en Jerarquía de Herencia

En el artículo -La Clase Object y sus Miembros en C#- aprendimos que varios de los métodos disponibles de la clase Object pueden ser sobreescritos, por poner un caso: ToString. Recordemos su firma:

public virtual string ToString()

Este método puede ser sobreescrito por cualquier subclase que herede de Object (por la naturaleza jerárquica del Framework .NET, todas las clases heredan de este superclase).

Definición parcial de la clase Object:

public class Object
{
// Definiciones restantes sobre la clase Object

public virtual string ToString();
}

Ahora tenemos la clase Subclase que hereda implícitamente de Object:

public class Subclase
{
// Definiciones restantes sobre la clase Object

public override string ToString() // Esto es correcto.
  {
// Implementación de ToString en Subclase
}
}

La redefinición de ToString en la clase Subclase es correcta, dado que el modificador de acceso del método sobreescrito coincide con el de ToString definido en la clase Object.

Por otro lado, si hacemos algo como esto:

public class Subclase2
{
// Definiciones restantes sobre la clase Object

protected override string ToString() // Esto es correcto.
  {
// Implementación de ToString en Subclase
}
}

Vamos a tener problemas. Para mirar esto en acción:


Esto se debe a que se está cambiando el grado de acceso del modificador en el método ToString en la subclase Subclase2. Error:

error CS0507: `Subclase2.ToString()': cannot change access modifiers when overriding `public' inherited member `object.ToString()'

2. Inconsistencias de Accesibilidad

Si tenemos la clase llamada B, y esta clase hereda de A, y A tiene un modificador de acceso más restrictivo que el de la subclase BB está obligado a utilizar el mismo modificador, o, uno más restrictivo. Me explico mejor:

internal class A
{
// Miembros de la clase A
}

public class B : A
{
// Miembros de la clase B
}

Esto nos va generar el siguiente error

error CS0060: Inconsistent accessibility: base class `A' is less accessible than class `B'


Esta inconsistencia -CS0060 [7]- también la podemos relacionar con la que se produce al intentar cambiar el modificador de acceso en una jerarquía de herencia, como en la sección anterior -CS0507 [8]-.

Esto no ocurre si vamos de un modificador menos restrictivo a uno más restrictivo, como en:

public class A
{
// Miembros de la clase A
}

internal class B : A
{
// Miembros de la clase B
}

Con esta definición no vamos a tener ningún error en tiempo de compilación.

Conclusiones

Aprendimos acerca de las inconsistencias que pueden surgir cuando manipulamos incorrectamente los modificadores de acceso en una jerarquía de herencia; por ejemplo, el cambiar el modificador de acceso con grado restrictivo superior a uno inferior: internal -> public. Lo contrario, public -> internal, sí está permitido. Es importante cuidarnos de estas inconsistencias cuando estamos definiendo nuestros tipos, o creando una jerarquía de herencia.

Glosario


  • Accesibilidad
  • Herencia
  • Modificador de acceso
  • Restricción

Enlaces & Literatura

[1]: C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.
[2]: Access Modifiers (C# Reference) - http://msdn.microsoft.com/en-us/library/vstudio/wxh6fsc7%28v=vs.100%29.aspx
[3]: Modificadores de Acceso en C# - http://ortizol.blogspot.com/2014/04/friend-assemblies-en-c.html
[4]: Friend Assemblies en C# - http://ortizol.blogspot.com/2014/04/friend-assemblies-en-c.html
[5]: Superposición de Modificadores de Acceso en C# - http://ortizol.blogspot.com/2014/04/superposicion-de-modificadores-de.html
[6]: La Clase Object y sus Miembros en C# - http://ortizol.blogspot.com/2014/04/la-clase-object-y-sus-miembros-en-c.html
[7]: Compiler Error CS0060 - http://msdn.microsoft.com/en-us/library/5732hs83%28v=vs.90%29.aspx
[8]: Compiler Error CS0507 - http://msdn.microsoft.com/en-us/library/vstudio/41k1ad8b%28v=vs.100%29.aspx


J

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.