Programacion Orientada a Objetos I

junio 01, 2006

Herencia Multinivel

Herencia Multinivel

La herencia puede tener multiples niveles. Esto es, una clase base puede tener clases derivadas, cada una de las cuales puede tener clases derivadas, y continuar heredando.Estas clases constituyen lo que conocido como herencia jerárquica o arbol de herencia. Todas las reglas que aplican a una herencia de un solo nivel tambien aplican para la herencia múltiple. Podemos extender nuestro ejemplo de la persona, empleado y cliente y agregarle dos mas clases a la herencia: EmpleadoVentas y Gerente. Estas estan derivadas de la clase Empleado. Los empleados de ventas tienen un salario base (representado por la clase base Empleado m_salario) y un bono mensual, que es calculado en base a un porcentaje de su salario. El gerente tiene un salario (como el empleado) y tiene tambien un bono gerencial. Hemos cambiado el campo m_salario como protected y le hemos agregado dos nuevas clases.

Public Class EmpleadoVentas
Inherits Empleado

Protected m_bono As Decimal

Public Property bono() As Decimal
Get
Return m_bono
End Get
Set(ByVal Value As Decimal)
m_bono = Value
End Set
End Property

Public Sub New(Optional ByVal nombre As String = "", _
Optional ByVal fecha As Date = #1/1/1990#, _
Optional ByVal email As String = "", _
Optional ByVal salario As Decimal = 0, _
Optional ByVal bono As Decimal = 0)
MyBase.New(nombre, fecha, email, salario)
m_bono = bono
End Sub
End Class

Public Class Gerente
Inherits Empleado
Protected m_bono As Decimal

Public Property bono() As Decimal
Get
Return m_bono
End Get
Set(ByVal Value As Decimal)
m_bono = Value
End Set
End Property

Public Sub New(Optional ByVal nombre As String = "", _
Optional ByVal fecha As Date = #1/1/1990#, _
Optional ByVal email As String = "", _
Optional ByVal salario As Decimal = 0, _
Optional ByVal bono As Decimal = 0)
MyBase.New(nombre, fecha, email, salario)
m_bono = bono
End Sub
End Class
Module Module1

Sub Main()
Dim EV As EmpleadoVentas
EV = New EmpleadoVentas("jose", #12/12/2006#, "jose@uabc.mx", 500.55, 200.45)


End Sub

End Module


Una cosa que es muy notable en las clases que son derivadas de otras clases derivadas es el uso de la palabra MyBase. Cuando se uso en la clase EmpleadoVentas, por una instancia, no refleja solo los miembros de la clase base de EmpleadoVenta (empleado), si no todos los miembros de Empleado, y cualquier miembro del cual el Empleado hereda de sus parientes (person). Estos miembros seran visibles cuando teclees MyBase el cual le va a seguir un punto y saldrá el listado de todos los miembros.

Bibliografia VB .NET by Example p .315-321

Implicaciones de la Herencia

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

mayo 30, 2006

Tarea 2 Modulo

Module Module1

Sub Main()
Dim Doc As docente
Doc = New docente

Dim Alu As alumno
Alu = New alumno

Dim Adm As Administrativo
Adm = New Administrativo

Dim x As Integer
Dim opc As Integer
Dim bec As String
Dim nmaterias As Integer

Do
Console.WriteLine("1.- Captura de Alumno")
Console.WriteLine("2.- Captura de Docente")
Console.WriteLine("3.- Captura de Administrativo")
Console.WriteLine("4.- Mostrar todos los datos")
Console.WriteLine("5.- Salir")
opc = Console.ReadLine()
Select Case (opc)
Case 1
Console.WriteLine("Matricula: ")
Alu.Matricula = Console.ReadLine()
'solo para restringir con una 's' o un 'n' en la captura
Do
Console.WriteLine("Becado s/n")
bec = Console.ReadLine()
If bec = "s" Then
Alu.Becado = True
ElseIf bec = "n" Then
Alu.Becado = False
End If
If bec <> "s" And bec <> "n" Then
Console.WriteLine("Tienes que teclear la letra s o la letra n minusculas")
End If
Loop While bec <> "s" And bec <> "n"
Console.WriteLine("Turno M / V ")
Alu.Turno = Console.ReadLine()


CapDatP(Alu)
Console.WriteLine("")
Console.WriteLine("")
Console.WriteLine("Mostrando todos los datos capturados: ")
MostDatP(Alu)
Console.WriteLine("Matricula {0}", Alu.Matricula)
Console.WriteLine("Becado s/n {0}", Alu.Becado)
Console.WriteLine("Turno {0}", Alu.Turno)
Console.ReadLine()


Case 2
Console.WriteLine("No. de Empleado")
Doc.NoEmpleado = Console.ReadLine
Console.WriteLine("Sueldo:")
Doc.Sueldo = Console.ReadLine
CapDatP(Doc)

'El sueldo total es = al numero de materias * sueldo
Do
Console.WriteLine("¿Cuantas materias imparte? < 12")
nmaterias = Console.ReadLine
Loop While nmaterias > 12
For x = 0 To nmaterias - 1
Console.WriteLine("Materia {0}:", x + 1)
Doc.Materias(x) = Console.ReadLine
Next
Console.WriteLine("")
Console.WriteLine("")
Console.WriteLine("Mostrando todos los datos capturados del Docente: ")
Console.WriteLine("No. de empleado {0}", Doc.NoEmpleado)

MostDatP(Doc)
Console.WriteLine("Sueldo {0}", Doc.Sueldo)
Console.WriteLine("Materias:")
For x = 0 To nmaterias - 1
Console.WriteLine("{0}.- {1}", x + 1, Doc.Materias(x))
Next
Console.ReadLine()

Case 3
Console.WriteLine("No. de empleado:")
Adm.NoEmpleado = Console.ReadLine
Console.WriteLine("Sueldo: ")
Adm.Sueldo = Console.ReadLine
Console.WriteLine("Puesto: ")
Adm.puesto = Console.ReadLine

CapDatP(Adm)

Console.WriteLine("")
Console.WriteLine("")
Console.WriteLine("Mostrando todos los datos capturados del Administrativo: ")
Console.WriteLine(" No. de empleado {0}", Adm.NoEmpleado)
MostDatP(Adm)

Console.WriteLine("Puesto {0} ", Adm.puesto)
Console.WriteLine("Sueldo {0}", Adm.Sueldo)
Console.ReadLine()
Case 4
Console.WriteLine("")
Console.WriteLine("")
Console.WriteLine("Mostrando todos los datos capturados Alumno: ")

Console.WriteLine(Alu.Matricula)
MostDatP(Alu)
Console.WriteLine("Becado s/n {0}", Alu.Becado)
Console.WriteLine("Turno {0}", Alu.Turno)

Console.WriteLine("")
Console.WriteLine("")
Console.WriteLine("Mostrando todos los datos capturados Académico: ")
Console.WriteLine(" No. de empleado {0}", Doc.NoEmpleado)
MostDatP(Doc)

Console.WriteLine("Sueldo {0}", Doc.Sueldo)
Console.WriteLine("Materias:")
For x = 0 To nmaterias - 1
Console.WriteLine("{0}.- {1}", x + 1, Doc.Materias(x))
Next

Console.WriteLine("")
Console.WriteLine("")
Console.WriteLine("Mostrando todos los datos capturados Administrativo : ")
Console.WriteLine(" No. de empleado {0}", Adm.NoEmpleado)
MostDatP(Adm)

Console.WriteLine("Sueldo {0}", Adm.Sueldo)
Console.WriteLine("Puesto {0} ", Adm.puesto)
Console.ReadLine()
End Select
Loop While opc <> 5
End Sub
Function CapDatP(ByRef tpersona As Object)
Console.WriteLine("Nombre:")
tpersona.Nombre = Console.ReadLine()
Console.WriteLine("Domicilio: ")
tpersona.domicilio = Console.ReadLine()
Console.WriteLine("Telefono: ")
tpersona.Telefono = Console.ReadLine()
Console.WriteLine("Fecha de Nacimiento: ")
tpersona.FechaNac = Console.ReadLine()
End Function

Function MostDatP(ByVal tpersona As Object)
Console.WriteLine("Nombre: {0}", tpersona.nombre)
Console.WriteLine("Domicilio: {0}", tpersona.domicilio)
Console.WriteLine("Telefono: {0}", tpersona.Telefono)
Console.WriteLine("Fecha de Nacimiento: {0}", tpersona.FechaNac)
End Function
End Module

Tarea 2 class persona (clase heredada)

Public Class Persona
Private m_nombre As String
Private m_domicilio As String
Private m_FechaNac As Date
Private m_Telefono 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 domicilio() As String
Get
Return m_domicilio
End Get
Set(ByVal Value As String)
m_domicilio = Value
End Set
End Property

Public Property FechaNac() As Date
Get
Return m_FechaNac
End Get
Set(ByVal Value As Date)
m_FechaNac = Value
End Set
End Property

Public Property Telefono() As String
Get
Return m_Telefono
End Get
Set(ByVal Value As String)
m_Telefono = Value
End Set
End Property
End Class

Tarea 2 class administrativo

Public Class Administrativo
Inherits Persona

Private m_NoEmpleado As String
Private m_sueldo As Double
Private m_puesto As String

Public Property NoEmpleado() As String
Get
Return m_NoEmpleado
End Get
Set(ByVal Value As String)
m_NoEmpleado = Value
End Set
End Property

Public Property Sueldo() As Double
Get
Return m_sueldo
End Get
Set(ByVal Value As Double)
m_sueldo = Value
End Set
End Property

Public Property puesto() As String
Get
Return m_puesto
End Get
Set(ByVal Value As String)
m_puesto = Value
End Set
End Property
End Class

Tarea 2 class docente

Public Class docente
Inherits Persona

Private m_NoEmpleado As String
Private m_Sueldo As Double
Private m_Materias(12) As String

Public Property NoEmpleado() As String
Get
Return m_NoEmpleado
End Get
Set(ByVal Value As String)
m_NoEmpleado = Value
End Set
End Property


Public Property Sueldo() As Double
Get
Return m_Sueldo
End Get
Set(ByVal Value As Double)
m_Sueldo = Value
End Set
End Property

Public Property Materias(ByVal indice As Integer) As String
Get
Return m_Materias(CInt(indice))
End Get
Set(ByVal Value As String)
m_Materias(indice) = Value
End Set
End Property



End Class

Tarea 2 class alumno

Public Class alumno
Inherits Persona

Private m_Matricula As String
Private m_Becado As Boolean
Private m_Turno As String

Public Property Matricula() As String
Get
Return m_Matricula
End Get
Set(ByVal Value As String)
m_Matricula = Value
End Set
End Property

Public Property Becado() As Boolean
Get
Return m_Becado
End Get
Set(ByVal Value As Boolean)
m_Becado = Value
End Set
End Property

Public Property Turno() As String
Get
Return m_Turno
End Get
Set(ByVal Value As String)
m_Turno = Value
End Set
End Property


End Class