Programacion I Declaración de Clases en C

Download Report

Transcript Programacion I Declaración de Clases en C

Universidad Domingo Savio
Facultad de Ciencias y Tecnología de la
Información
Carrera
Ingeniería en Redes y Telecomunicaciones
Materia : Programación I
Programación Orientada a Objetos
12/04/2015
1
Clases y Objetos en C#
12/04/2015
2
Agenda
Representación de Clases
Declaración de Clases
Modificadores de Acceso
Declaración de campos de instancia
Declaración de métodos
12/04/2015
3
Representación de una clase
Nombre de la Clase
-Atributos
+Operaciones()
Complejo
+Sumar()
+Restar()
+Multiplicar()
+Dividir()
+LeerModulo()
+LeerArgumento()
+LeerParteReal()
+LeerParteImaginaria()
12/04/2015
Motocicleta
-Color
-Cilindros
-Vel_Maxima
+Arrancar()
+Acelerar()
+Frenar()
Televisión
+Enceder()
+Apagar()
+CambiarCanal()
+RegularVolumen()
4
Cómo se define una clase en
C#
Sintaxis:
[atributos] [modificador_de_acceso]
class nombre_de_la_clase [ :
clase_base [ , interface(s) ] ]
{
Declaración_de_atributos
Declaración_de_métodos
}
12/04/2015
5
Ejemplo de una clase
class Dado {
public Random generador;
public Dado() {
generador = new Random();
}
public int Lanzar() {
int valor = generador.Next(1, 7);
return valor;
}
}
12/04/2015
6
Creación y uso de objetos
Las clases son sólo declaraciones.
Los verdaderos actores de la Programación
Orientada a Objetos son los objetos.
Una vez declarada una clase, podemos
utilizar el nombre de la clase como un nuevo
Tipo.
Por lo que podemos declarar una variable de
referencia a un objeto que sea del tipo de la
clase.
12/04/2015
7
Creación y uso de objetos
Dado d;
Declara un objeto, d, que es una instancia de la clase
Dado.
Una instancia de un objeto es una variable de
referencia, por lo tanto los datos del objeto se
almacenan en el montículo (heap).
Sin embargo el enunciado anterior no crea el objeto.
Es necesario utilizar el operador new
Dado d1 = new Dado();
Dado d2;
d2 = new Dado();
12/04/2015
8
Creación y uso de objetos
Una vez que la instancia del objeto está
definido, podemos acceder a los
campos del objeto mediante el
operador .
int n = d1.Lanzar();
Console.WriteLine(d2.Lanzar());
12/04/2015
9
Modificadores de visibilidad
Los atributos y los métodos pueden
tener modificadores, que indican los
niveles de acceso que otros métodos
pueden tener sobre ellos.
C# cuenta con un conjunto de
modificadores de visibilidad.
12/04/2015
10
Modificadores de Acceso de
C#
Modificador Restricción
de acceso
public
Sin restricciones. Los miembros marcados como
public están visibles a cualquier método de la
clase
private
Los miembros de una clase A marcados como
private son accesibles sólo a los métodos de la
clase A.
protected
Los miembros de una clase A marcados
protected pueden ser accedidos por los métodos
de la clase A y también por los métodos de las
clases derivadas de la clase A.
12/04/2015
11
Modificadores de Acceso de
C#
Modificador
de acceso
Restricción
internal
Los miembros de una clase A marcados internal
pueden ser accedidos por los métodos de
cualquier clase en el ensamblado (assembly) de
A.
protected
internal
Los miembros de una clase A marcados
protected internal pueden ser accedidos por los
métodos de la clase A y también por los
métodos de las clases derivadas de la clase A,
así como por los métodos de cualquier clase en
el ensamblado (assembly) de A.
Esto equivale a protected OR internal.
12/04/2015
12
Laboratorio 3:
Encapsulamiento
Modifique la clase DemoDado para
generar el número aleatorio
directamente, sin llamar al método
Lanzar():
Console.WriteLine("Al lanzar el
dado cayó {0}",
d.generador.Next(1,7));
12/04/2015
13
Laboratorio 3:
Encapsulamiento
Modifique el acceso al campo de instancia
generador clase haciendo su acceso privado:
private Random generador;
Compile y ejecute el programa. ¿Qué sucedió?
Vuelva a escribir el código para que se invoque
al método Lanzar().
Console.WriteLine("Al lanzar el dado
cayó {0}", d.Lanzar());
12/04/2015
14
Encapsulamiento
La recomendación es hacer que los
campos de instancia tengan visibilidad
privada, manteniéndolos en secreto,
mientras que los métodos tengan
visibilidad pública.
En algunas ocasiones se puede requerir
que un método tenga visibilidad
privada.
12/04/2015
15
Declarando un campo de
instancia
Los campos de instancia almacenan los
valores de los atributos que forman
parte del estado de los objetos de una
clase.
Cada objeto almacenará por separado
los valores de sus campos.
Los campos de instancia de una clase
pueden ser de lectura y escritura, de
sólo lectura o de sólo escritura.
12/04/2015
16
Accediendo un campo de
instancia.
Para acceder un campo de instancia es
necesario crear previamente un objeto
(o instancia) de la clase.
Para acceder a los campos de instancia
se utiliza la siguiente sintaxis:
Nombre_instancia.nombre_campo
12/04/2015
17
Métodos de instancia
Los métodos son a las clases lo que los verbos son a
las oraciones.
Indican las acciones que definen el comportamiento
de los objetos de la clase.
Un método define una acción específica o un cálculo.
Un método es identificado por su firma (signature),
que consiste del nombre del método y el número y
tipos de datos de sus parámetros.
Además, un método tiene un valor de retorno, o la
palabra reservada void si no se retorna nada, y una
lista de modificadores que determina su accesibilidad
y comportamiento polimórfico.
12/04/2015
18
Ejemplo de método
public int Lanzar()
{
int valor = generador.Next(1, 7);
return valor;
}
12/04/2015
19
Parámetros
Para poder realizar su acción o cálculo
un método puede requerir información
adicional que será enviada por el código
que invoque el método.
En el ejemplo anterior, el método
Lanzar() no tiene parámetros.
Sin embargo, un método puede tener
cualquier número de parámetros.
12/04/2015
20
Métodos con parámetros
public void Depositar(Decimal cantidad) {
saldo = saldo + cantidad;
}
public void Transferir(double cantidad,
CuentaBancaria otraCuenta) {
if (Retirar(cantidad) == true) {
otraCuenta.Depositar(cantidad);
}
}
12/04/2015
21
Métodos que retornan un
valor
public double GetSaldo() {
return saldo;
}
public bool Retirar(double cantidad) {
boolean seEfectuoRetiro;
if (saldo >= cantidad) {
saldo = saldo - cantidad;
seEfectuoRetiro = true;
} else {
seEfectuoRetiro = false;
}
return seEfectuoRetiro;
}
12/04/2015
22
Sobrecarga de métodos
public CuentaBancaria() {
saldo = 0.0;
}
public CuentaBancaria(double nuevoSaldo)
{
saldo = nuevoSaldo;
}
12/04/2015
23
Métodos get y set
¿Si los atributos son privados cómo
otros objetos pueden acceder a ellos ?
Los Métodos selectores (métodos get)
devuelven todo el o parte del estado de
un objeto encapsulado.
Los métodos modificadores (métodos
set) cambian todo el o parte del estado
de un objeto encapsulado.
12/04/2015
24
Alcance
Las variables declaradas dentro de un método,
constructor u otro bloque de código no pueden
ser utilizadas en toda la clase.
El Alcance de una variable se refiere a la parte de
un programa donde puede ser utilizada una
variable.
Una variable sólo puede ser utilizada en dentro
del bloque de código donde ha sido definida.
Así, dependiendo de donde estén declaradas,
una variable puede tener alcance de clase o
puede ser una variable local.
12/04/2015
25
Ejemplo de alcance
class MiClase {
int x;
public void UnMetodo(int a) {
int x;
Console.WriteLine(“{0}\t{1}”,x, this.x);
if (a > 0) {
int x = 5;
Console.WriteLine(“{0}\t{1}”,x, a);
}
}
}
12/04/2015
26
Constructores
Un constructor es un método especial que es
invocado automáticamente cuando se instancia
(crea) un objeto.
Los constructores frecuentemente se utilizan
para inicializar las variables de atributo de un
objeto.
12/04/2015
27
Ejemplo de constructor
class Dado {
public Random generador;
public Dado() {
generador = new Random();
}
public int Lanzar() {
int valor = generador.Next(1, 7);
return valor;
}
}
12/04/2015
28
Constructores
Como con los métodos, es posible
sobrecargar los constructores,
incluyendo múltiples constructores en
una clase, cada uno con el mismo
nombre y una serie diferente de
argumentos.
12/04/2015
29
Constructor predeterminado
Cuando el compilador encuentra una clase que
no tiene un constructor explícitamente
definido, inserta un constructor
predeterminado.
Por lo tanto toda clase tiene un constructor.
El constructor predeterminado no recibe
argumentos.
Se recomienda, declarar constructores dentro
de una clase para evitar que el compilador
inserte un constructor predeterminado.
12/04/2015
30
La referencia this
La palabra reservada this hace referencia a
la instancia actual de un objeto.
La referencia this es una referencia oculta
que se pasa a todos los métodos no estáticos
de una clase.
Cada método puede hacer referencia a los
otros métodos y variables de instancia de ese
objeto por medio de la referencia this.
12/04/2015
31
Usos de la referencia this
Por lo general se utiliza para calificar
miembros de instancia que pueden ser
ocultados por los parámetros:
Public CuentaBancaria(decimal saldo) {
this.saldo = saldo;
}
12/04/2015
32
Usos de la referencia this
También se puede utilizar para pasar el
objeto actual como un parámetro a otro
objeto:
class miClase {
public void MiMetodo(OtraClase otroObjeto) {
otroObjeto.OtroMetodo(this);
}
}
12/04/2015
33
Usos de la referencia this
Otro uso es para llamar a un constructor
sobrecargado desde otro constructor:
class CuentaBancaria {
private decimal saldo;
public CuentaBancaria() : this(0) {
}
public CuentaBancaria(decimal saldoInicial) {
this.saldo = saldoInicial;
}
…
}
12/04/2015
34
Usos de la referencia this
Finalmente, la referencia this se puede utilizar para
invocar explícitamente métodos y miembros de clase,
como una forma de documentación:
public bool Retirar(double cantidad) {
boolean seEfectuoRetiro;
if (this.saldo >= cantidad) {
this.saldo = this.saldo - cantidad;
seEfectuoRetiro = true;
} else {
seEfectuoRetiro = false;
}
return seEfectuoRetiro;
}
12/04/2015
35
Encapsulamiento de datos con
propiedades
Las propiedades permiten a los cliente el acceso al
estado de los objetos de la clase como si estuvieran
accediendo directamente a los campos miembros,
mientras realmente implementan ese acceso a través
de un método de la clase.
Por lo general el cliente desea acceder al estado del
objeto y no trabajar con métodos.
El diseñador de la clase quiere encapsular la
implementación ocultando los campos miembros,
proporcionando el acceso indirectamente a través de
un método.
12/04/2015
36
Encapsulamiento de datos con
propiedades
Para declarar una propiedad, escriba el tipo y el
nombre de la propiedad, seguido de un par de llaves.
Dentro de las llaves se pueden declarar los métodos
de acceso get y set.
Ninguno de estos métodos de acceso tienen
parámetros explícitos.
Sin embargo, el método set tiene un parámetro
implícito de nombre value, como se muestra a
continuación.
12/04/2015
37
Ejemplo de propiedades
Public class Curso {
private string nombre;
public string NombreDelCurso {
get {
return nombre;
}
set {
nombre = value;
}
}
}
12/04/2015
38
Ejemplo de propiedades
Curso mate = new Curso();
mate.NombreDelCurso = “Matemáticas I”;
Console.WriteLine(“Nombre del curso: {0}”,
mate.NombreDelCurso;
12/04/2015
39
Ejemplo de propiedades
public class Empleado {
private string nombre;
public string Nombre {
get {
return nombre;
}
set {
if (value == null) {
throw new NullReferenceException();
} else {
value = value.Trim();
if (value == “”) {
throw new ApplicationException(“El nombre está en blanco”);
} else {
nombre = value;
}
}
}
}
}
12/04/2015
40
Propiedades
Puede incluirse sólo la parte del getter o
del setter de una propiedad para
cambiar la accesibilidad de la
propiedad.
Si se proporciona sólo el getter la
propiedad será de sólo lectura.
Si se proporciona sólo el setter, algo
que es muy raro, la propiedad será de
sólo escritura.
12/04/2015
41
Ejemplo
public clase CuentaBancaria {
private decimal saldo;
public decimal Saldo {
get {
return saldo;
}
}
}
12/04/2015
42
Propiedades como campos
virtuales
Algunas veces no se requiere contar
con un campo miembro para
implementar las propiedades.
La propiedad podría calcular el valor a
partir de otros campos miembros.
12/04/2015
43
Ejemplo
public class Empleado {
private string nombre;
private string apellidos
public string NombreCompleto {
get {
return nombre + “ “ + apellidos;
}
}
}
12/04/2015
44