Implicaciones de la Herencia
Visibilidad
Hemos visto que los miembros de una clase puede tener uno de los tres modificadores de acceso estandares (Public, Private, y Friend). Tambien hemos mencionado, que podemos tener miembros declarados como protected y veremos como son y como usarlos.
Primero ocupamos mencionar que los modificadores public, private y friend son exactamente lo mismo en el caso de las clases derivadas o base. Un miembro public es accesible a cualquiera en el proyecto y fuera de el. Un miembro privado es accesible solamente dentro de la clase en la cual es declarada, pero no en cualquier clase derivada de esa clase! Los miembros amigos son visibles a cualquiera dentro del proyecto de donde la clase pertenece o es parte. Estos modificadores no cubren algunos casos especiales y por esa razón algunos modificadores nuevos tuvieron que ser añadidos.
Un campo private declarado en la clase base no puede ser accedido en cualquiera de los métodos de las propiedades de una clase derivada. En nuestro ejemplo, el campo m_nombre declarado en persona no podía ser accedido en un método de empleado, la clase empleado podía acceder a la propiedad nombre, el cual es declarado como publico. En general, podemos usar propiedades publicas para ofrecer acceso a los miembros privados, desafortunadamente, esto hará que las propiedades sean accesible a cualquiera. Alternativamente podríamos hacer las propiedades friend, de tal manera que puedan ser accedidas solamente de este proyecto. Pero en este caso no puedes usarlo de las clases de proyectos diferentes que deseas que herede de tu clase.
Habrá casos en los cuales en el que alguno de los miembros deban ser accedido por la clase por la que fueron declaradas y todas las clases derivadas de ella, pero no por cualquiera. Estos tipos de miembros deben de ser declarados como Protegidos (protected). Le da mas sentido declarar un miembro (normalmente un campo o una propiedad) como Protegido (protected) solamente si se intenta ser usada por clases derivadas de la clase en la cual es declarada. Si nadie va a heredar de la clase (si es una clase amiga, y no visible fuera del proyecto) Entonces los miembros protegidos funcionan igual que los miembros privados.
Si un miembro de la clase debiera de ser accedido por cualquiera en el proyecto y solo la clases derivadas fuera del proyecto, entonces los modificadores protegidos y los amigos pueden ser combinados. Los campos Protected Friend, propiedades, y metodos, son accesibles por cualquiera en el proyecto de la clase donde fue declarada y solamente de las clases derivadas de otros proyectos, los cuales extienden la clase en cuestión.
Public Class Persona
Protected m_nombre As String
Protected m_fecha As Date
Protected m_email As String
Public Property nombre() As String
Get
Return m_nombre
End Get
Set(ByVal Value As String)
m_nombre = Value
End Set
End Property
Public Property fecha() As Date
Get
Return m_fecha
End Get
Set(ByVal Value As Date)
m_fecha = Value
End Set
End Property
Public Property email() As String
Get
Return m_email
End Get
Set(ByVal Value As String)
m_email = Value
End Set
End Property
Public Sub New(Optional ByVal name As String = "", Optional ByVal fecha As Date = #1/1/1980#, Optional ByVal email As String = "")
m_nombre = name
m_fecha = fecha
m_email = email
End Sub
End Class
Hemos añadido un constructor con tres parámetros opcionales a la clase persona. Este es un constructor regular, el cual le asignara a los tres campos el valor del parámetro.
Public Class Empleado
Inherits Persona
Private m_salario As Decimal
Public Property salario() As Decimal
Get
Return m_salario
End Get
Set(ByVal Value As Decimal)
m_salario = Value
End Set
End Property
Public Sub New(Optional ByVal nombre As String = "", Optional ByVal fecha As Date = #1/1/1980#, Optional ByVal email As String = "", Optional ByVal salario As Decimal = 0)
MyBase.New(nombre, fecha, email)
m_salario = salario
End Sub
End Class
Hemos añadido un constructor tambien a la clase empleado, el cual llama el constructor MyBase (la clase persona) y asigna el salario.
MyBase puede estrictamente ser usado dentro de una clase derivada para acceder a la clase base. MyBase no es realmente un objeto. No se debe de usar si la clase base tiene miembros que pueden ser accedidos directamente. Sin embargo, esta no es el caso en este ejemplo, es por eso que lo necesitamos.
Ahora podemos construir un nuevo empleado.
Module Module1
Sub Main()
Dim e As Empleado
e = New Empleado("daniel", #12/19/1972#, "dgallo@univer.com", 154.25)
End Sub
End Module
No hay comentarios.:
Publicar un comentario