You are on page 1of 32

Programacin Orientada a Objetos con C#

Programacin Orientada
a Objetos en C#
Unidad 2.- Clases y objetos
Autor:
Dr. Ramn Roque Hernndez
http://ramonroque.com/Materias/pooTec.htm
ramonroque@yahoo.com
Colaboradores:
Ing. Gloria Ma. Rodrguez Morales
grodriguez@itnuevolaredo.edu.mx
Ing. Bruno Lpez Takeyas, M.C.
www.itnuevolaredo.edu.mx/takeyas
takeyas@itnuevolaredo.edu.mx

2.- Clases y objetos


2.1 Declaracin de clases: atributos, mtodos,
encapsulamiento.
2.2 Instanciacin de una clase.
2.3 Referencia al objeto actual.
2.4 Mtodos: declaracin, mensajes, paso de
parmetros, retorno de valores.
2.5 Constructores y destructores: declaracin
uso y aplicaciones.
2.6 Sobrecarga de mtodos.
2.7 Propiedades*
2

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

Programacin Orientada a Objetos con C#

Espacios de nombres
(namespace)
Organizan los diferentes componentes
Un programa puede contener varios
namespaces
Un namespace puede contener muchas clases
El programador puede crear sus propios
namespaces
Para accesar a namespaces se usa la directiva
using:
using System;
using System.Array;
3

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Ejemplo
{
class Program
{
static void Main(string[] args)
{
}
}
}
4

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

Programacin Orientada a Objetos con C#

Clases y objetos
Una clase es bsicamente un plano
para un tipo de datos personalizado.
Cuando se define una clase, se utiliza
cargndola en la memoria. Una clase
que se ha cargado en la memoria se
denomina objeto o instancia. Se crea
una instancia de una clase utilizando la
palabra clave de C# new
5

Clases en UML
Cada clase se representa en un
rectngulo con tres compartimentos:
Nombre
Atributos y propiedades
Mtodos

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

Programacin Orientada a Objetos con C#

Cmo declarar una clase


class nombre_de_la_clase
{
contenido de la clase

Dentro de la clase
Se pueden declarar variables, propiedades, mtodos,
etc.
Cada elemento puede tener un modificador de
acceso.
Un modificador de acceso especifica quienes estn
autorizados a ver ese elemento.
Si no se especifica ningn modificador de acceso, se
asume que se trata de un elemento private.
8

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

Programacin Orientada a Objetos con C#

Modificadores de acceso
public
Accesible a todos los elementos

private
Accesible solo a esa misma clase

protected
Accesible solo a la misma clase y mtodos de sus clases
derivadas. No accesible desde el exterior.

internal
Accesible solo a ese ensamblado

protected internal
Accesible desde el mismo ensamblado, la misma clase y
mtodos de sus clases derivadas

Modificadores de acceso
Accesible desde
Modificador de
acceso

Clase donde
se declar

Subclase
(Mismo
assembly)

Subclase
(Distinto
Assembly)

Externamente
(Mismo
Assembly)

Externamente
(Distinto
Assembly)

private

SI

NO

NO

NO

NO

internal

SI

SI

NO

SI

NO

protected

SI

SI

SI

NO

NO

protected
internal

SI

SI

SI

SI

NO

public

SI

SI

SI

SI

SI
10

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

Programacin Orientada a Objetos con C#

Ejemplo: Variables con


Modificadores de acceso
class claseA
{
//Si no se indica, es private
int numero;
private int numero1;
public int numero2;
protected int numero3 = 99;
internal int numero4;
protected internal int numero5;
}

11

Representacin de
modificadores de acceso en
C# y UML
Modificador de
acceso

Codificacin en C#

Representacin en
UML

Privado

private

Pblico

public

Protegido

protected

Interno

internal

Protegido interno

protected internal

+
#
~
#
12

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

Programacin Orientada a Objetos con C#

Miembros estticos y de
instancia
Miembro esttico (static): Slo se crea una
copia del miembro de la clase. Se crea
cuando se carga la aplicacin que contiene
la clase y existe mientras se ejecute la
aplicacin
Miembro de instancia: Se crea por default.
Se crea una copia para cada instancia de la
clase.
13

Miembros estticos y de
instancia
Un miembro esttico es un mtodo o campo
al que se puede obtener acceso sin hacer
referencia a una instancia determinada de
una clase
No es necesario crear una instancia de la
clase contenedora para llamar al miembro
esttico
Cuando se tiene acceso a mtodos estticos,
puede utilizar el nombre de clase, no el
nombre de instancia

14

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

Programacin Orientada a Objetos con C#

Declaracin de miembros
estticos
Cuando declara un campo de clase
esttico, todas las instancias de esa clase
compartirn ese campo
Una clase esttica es una cuyos
miembros son todos estticos Miembros Estticos
static void Main(string[] args)
{
Console.WriteLine(Tec Laredo);
}
15

Campos
Un campo es un dato comn a todos los
objetos de una determinada clase.
Las variables declaradas dentro de una clase
son ejemplos de campos (fields).

16

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

Programacin Orientada a Objetos con C#

Ejemplo de una clase


class Persona
{
string Nombre;
// Campo de cada objeto que almacena su nombre
int Edad;
// Campo de cada objeto que almacena su edad
public void IncrementarEdad() // Incrementa la edad del objeto
{
Edad++;
}
}
17

Crear objetos:
Instanciacin
Una vez creada la clase, ya es posible consumirla
mediante la instanciacin.
La instanciacin es el proceso de crear objetos a
partir de una clase.
1.

Ejemplo en dos pasos:


claseA miobjetoA;
miobjetoA = new claseA();

Ejemplo en un paso:

2.

3.

Definir el tipo de
miObjetoA
Adquirir memoria sin
inicializar para el nuevo
objeto usando new.
Ejecutar el constructor
para inicializar la memoria
y convertirla en un objeto
usable

claseA miobjetoA = new claseA();


18

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

Programacin Orientada a Objetos con C#

Objetos en UML
En UML un objeto se representa como
un rectngulo con un nombre
subrayado
Automvil
Persona
CuentaBancaria

19

Accediendo a los miembros


de los objetos
Asignacin:
miobjetoA . Numero2 = 50;
Nombre
del objeto

Seleccin

Miembro

Lectura:
miOtraVariable = miobjetoA . Numero2;
20

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

10

Programacin Orientada a Objetos con C#

Mtodos

21

Mtodos
Contienen instrucciones para ejecutar al
momento de ser invocados.
Un mtodo contiene:

Modificador de Acceso (Determina su visibilidad)


Tipo de dato (Devuelto al finalizar su ejecucin)
Identificador (Nombre con el cual se invoca)
Parmetros (Cero o mas variables que recibe el
mtodo)
22

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

11

Programacin Orientada a Objetos con C#

Mtodos
En C# las subrutinas se conocen como
mtodos, se codifican como parte de una
clase y se clasifican en
Procedimientos NO devuelven valor

Subrutinas
Funciones Devuelven un valor
23

Sintaxis de los mtodos


< tipoValorDevuelto > < nombreMtodo > (< parmetros >)
{
< cuerpo >
void significa que NO
}
devuelve valor (procedimiento)

Ejemplo:
void Saludo( )
{
Console.Write(Hola);
}
24

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

12

Programacin Orientada a Objetos con C#

Ejemplo de mtodo
(En la clase)
Modificador
de acceso

Tipo de dato
del valor regresado

Identificador

Parmetros

class Carro
{
public void Encender()
{
System.Console.WriteLine("El Auto se ha
encendido!");
}
}
25

Llamadas a los mtodos


class Program
{
static void Main(string[] args)
{
Subrutina(); // Llamada
}
static void Subrutina( )
{
. . . // Codificacin
}
}

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

26

13

Programacin Orientada a Objetos con C#

Llamadas de
procedimientos
class Program
{
static void Main(string[] args)
{
Procedimiento(); // Llamada
}
static void Procedimiento( )
{
El Procedimiento
Console.Write(Tec Laredo);
NO devuelve
valor
return();// Fin del Procedimiento
}
}
27

Mtodos que reciben


parmetros

Entre los parntesis se especifican una o mas variables


(separadas por comas) con sus respectivos tipos de datos.
Esas variables estarn accesibles dentro del mtodo.

public void CambiarEstado( string nuevoestado )


Dato
{
de
estado = nuevoestado;
entrada
}

Al momento de invocar el mtodo, se deben incluir esos valores


en la llamada:

miCarro.CambiarEstado(Apagado);
28

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

14

Programacin Orientada a Objetos con C#

Parmetros recibidos por


los mtodos

Por valor Se enva una copia del valor de


la variable

Parmetros
Por referencia Se enva la direccin de la
variable

29

Envo de parmetros por


valor
class Program
{
static void Main(string[] args)
{
int x=10;
Subrutina( x ); // Se envia el valor de x
Console.Write(x=+x.ToString()); // x=10
}
static void Subrutina(int y)
{
y+=5;
Console.Write(y=+y.ToString()); // y=15
}
}
30

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

15

Programacin Orientada a Objetos con C#

Variables: Por valor

Las variables de los tipos de datos bsicos (primitivos) se


crean en el STACK. Se dice que son manejados por valor.

num1

int num1;

num1 = 50;

STACK

STACK

No
definido

num1

50

31

Envo de parmetros por


referencia
static void Main(string[] args)
{
int x = 10;
Rutina(ref x); // Se envia la referencia de x
Console.WriteLine("x=" + x); // x=15
Console.ReadKey();
}
static void Rutina(ref int y)
{
y += 5;
Console.WriteLine("\n\ny=" + y); // y=15
}

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

32

16

Programacin Orientada a Objetos con C#

Objetos: Por referencia

Los objetos se crean en el HEAP. En el STACK solo se


guarda una referencia a la direccin del HEAP donde se
encuentran. Se dice que son manejados por referencia.
Cliente

cli;

cli = new Cliente();

STACK

cli

No
definido

cli

STACK

HEAP

[ Referencia
cli ]

objeto cli

33

Objetos: Por referencia


Cliente

cli2 = cli solo copia las


referencias, no copia los
objetos.

cli2 = new Cliente();

STACK

cli

[ Referencia
cli ]

cli2

[ Referencia
cli2 ]

HEAP
El objeto cli2 queda sin
referencias hacia l .

objeto cli

cli2 = cli;
objeto cli2

STACK

HEAP

cli

[ Referencia
cli ]

objeto cli

[ Referencia
cli2 ]

objeto cli2

cli2

34

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

17

Programacin Orientada a Objetos con C#

Mtodos que retornan valores

El Tipo de dato del mtodo NO es void.


Dentro del mtodo debe haber una sentencia return con algn
valor del tipo de dato del mtodo.
Ejemplo (Al declararlo):
public string ConsultarEstado()
{
return estado;
}
Al llamar al mtodo (desde el programa):
string estado_actual = miCarro.ConsultarEstado();

35

Llamadas de mtodos que


retornan valor (funciones)
static void Main(string[ ] args)
{
double Radio = 10, Area;
Area = Funcion(Radio);
Console.WriteLine("Area=" + Area);
Variable
receptora
Console.ReadKey();
}
static double Funcion(double r)
{
return (Math.PI * r * r);
}

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

Argumento enviado
a la Funcin

Valor devuelto por la


Funcin

36

18

Programacin Orientada a Objetos con C#

Invocando al mtodo
(En el programa)

Carro miCarro = new Carro();


miCarro.Encender();

Nombre del
objeto

Nombre del
mtodo

Parmetros

37

Invocando mtodos
class Arbol
{
int Altura;
public void Podar( )
{
Console.WriteLine(Podando );
}
}
Arbol Pino = new Arbol(); // Se crea el objeto Pino
Pino.Podar(); //Se invoca el mtodo Podar() del
objeto Pino
38

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

19

Programacin Orientada a Objetos con C#

mbito de las variables


El mbito de una variable define dnde
puede usarse una variable
Una variable local declarada en un bloque
de programa, slamente puede ser usada
en ese bloque
El mbito de una variable tambin aplica a
los mtodos y a los ciclos for
39

mbito de las variables

mbito de
variables

Locales Se declaran y utilizan dentro de un


contexto especfico. No se puede hacer
referencia a ellas fuera de la seccin de cdigo
donde se declara.
Globales Se declaran fuera del cuerpo de
cualquier mtodo

40

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

20

Programacin Orientada a Objetos con C#

mbito de variables en un
ciclo for
for(int x = 1; x<=10; x++)
{
Console.Write(x);
}
Console.Write(x);

41

this
Para hacer referencia (explcita) a un elemento que se
encuentra dentro de la misma clase (sta) se utiliza
this.
class Articulo
{
private double precio = 0;
public void PonerPrecio ( double precio )
{
this.precio = precio;
}
public double ConsultarPrecio()
{
return this.precio;
}
}

Muy til cuando existen distintos elementos con


el mismo nombre, pero con distinto significado
dentro de un mbito determinado.
42

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

21

Programacin Orientada a Objetos con C#

Ejemplos de mtodos
class Carro
{
private string estado = "Apagado";
public void Encender()
{
estado = "Encendido";
}
public void Apagar()
{
estado = "Apagado";
}
public string ConsultarEstado()
{
return estado;
}
public void CambiarEstado(string nuevoestado)
{
estado = nuevoestado;
}
}
43

Ejemplos de llamadas a los


mtodos
Continuacin del ejemplo anterior (Clase Carro)
class Programa
{
static void Main()
{
Carro miCarro = new Carro();
miCarro.Encender();
System.Console.WriteLine(miCarro.ConsultarEstado());
miCarro.CambiarEstado("En marcha");
System.Console.WriteLine(miCarro.ConsultarEstado());
miCarro.Apagar();
System.Console.WriteLine(miCarro.ConsultarEstado());
System.Console.ReadLine();
}
}
44

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

22

Programacin Orientada a Objetos con C#

Sobrecarga
Se refiere a la posibilidad de crear mtodos que
posean el mismo nombre y difieran en la cantidad y/o
tipo de parmetros (Firma).
No es posible crear 2 funciones con el mismo identificador
que solo difieran en el tipo de dato devuelto.
static bool impresion(int num)
static char impresion(int num)

No es posible que 2 mtodos sobrecargados solo difieran en


el modificador static.

45

Ejemplo de sobrecarga
class Impresion
{
public void Imprimir()
{
System.Console.WriteLine("Sistema de Usuarios");
}
public void Imprimir(string mensaje)
{
System.Console.WriteLine(mensaje);
}
public void Imprimir (string titulo, string mensaje)
{
System.Console.WriteLine("===== " + titulo + " =====");
System.Console.WriteLine(mensaje);
}
}
class Programa
{
static void Main()
{
Impresion im = new Impresion ();
im.Imprimir();
im.Imprimir("Siga las instrucciones en pantalla", "Use minusculas");
im.Imprimir(" Gracias! ");
System.Console.ReadLine();
}
}
46

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

23

Programacin Orientada a Objetos con C#

Mtodo Constructor
Mtodo especial que es invocado automticamente
cada vez que un objeto nuevo es creado (new).
Debe poseer el mismo nombre de la clase.
No posee tipo de dato de retorno.
Si la clase no posee un constructor, C# crea uno
vaco por default.
47

Constructor

48

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

24

Programacin Orientada a Objetos con C#

Ejemplo de constructor
class Persona
{
public string Nombre;
Constructor.
(notar que tiene
el mismo nombre
de la clase)

public Persona()
{
Nombre = "Desconocido";
}

Dentro del
constructor se
realizan las
inicializaciones
correspondientes

class Programa
{
static void Main()
{
Persona unaPersona = new Persona();
System.Console.WriteLine(unaPersona.Nombre);
System.Console.ReadLine();
}
}

49

Ejemplo de constructor que


recibe parmetros
class Persona
{
public string Nombre;
public Persona(string nombreDeLaPersona)
{
Nombre = nombreDeLaPersona;
}
}
class Programa
{
static void Main()
{
Persona otraPersona = new Persona("Ramon");
System.Console.WriteLine(otraPersona.Nombre);
System.Console.ReadLine();
}
}

Se debe proporcionar el valor de los parmetros


al momento de la creacin del objeto.
50

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

25

Programacin Orientada a Objetos con C#

Ejemplo:
Sobrecarga de Constructor
class Persona
{
public string Nombre;
Constructores
public Persona()
{ Nombre = "Desconocido";
}
public Persona(string nombreDeLaPersona)
{ Nombre = nombreDeLaPersona;
}
}
class Programa
{
static void Main()
{
Persona unaPersona = new Persona();
System.Console.WriteLine(unaPersona.Nombre);
Persona otraPersona = new Persona("Ramon");
System.Console.WriteLine(otraPersona.Nombre);
System.Console.ReadLine();

Dos constructores
= Dos diferentes
formas de
crear objetos

}
}

51

Mtodo Destructor
No puede llamarse explcitamente.
Se invoca automticamente cuando el objeto es
destruido.
Invocado por el Garbage Collector (GC) justo antes
de desasignar la memoria del objeto.
Usado para cerrar archivos, conexiones de red,
canales abiertos, etc.
Sintaxis similar al mtodo constructor, pero
anteponiendo una tilde (~) al nombre.

52

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

26

Programacin Orientada a Objetos con C#

Destructor

53

Ejemplo de destructor

class Empleado
{
~Empleado()
{
System.Console.WriteLine("Se ha destruido el Empleado ");
}
}

Un destructor NO puede sobrecargarse, y se ejecuta cuando


el recolector de basura destruye el objeto.

54

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

27

Programacin Orientada a Objetos con C#

Destruccin de objetos
C# gestiona la memoria de modo automtico
mediante el recolector de basura (Garbage
Collector o GC), quien se encarga de eliminar la
memoria que en algn momento se solicit y no se
ocupa mas.
En C# no existe el operador contrario a new.
Por lo que, de manera general, NO es posible
controlar exactamente el momento en el cual la
memoria vuelve a estar disponible.
55

Destruccin de objetos
Se puede indicar en el programa cuando un objeto
deja de ser util, asignndole el valor null.
miObjeto = null

Cuando el GC lo note, tomar cartas en el asunto.


El instante preciso en que lo har, queda fuera del
alcance del programador.

56

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

28

Programacin Orientada a Objetos con C#

El Garbage Collector
(recolector de basura)
Se asegura que:
Los objetos son destruidos una sola vez
Se destruyan objetos que ya no son utilizados.

Trabaja cuando:
Hay poca memoria disponible
La aplicacin est finalizando
El programador lo invoca manualmente (NO recomendado):
System.GC.Collect()

57

Propiedades

58

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

29

Programacin Orientada a Objetos con C#

Propiedades

Son mecanismos para acceder a los valores (variables) que


poseen los objetos.
Algunos autores las consideran sinnimos de los datos, sin
embargo no siempre lo son (solamente en el caso de las
propiedades autoimplementadas).

Se pueden implementar:
Declarando la variable como public
No sera posible especificarla como Solo-Lectura o Solo-Escritura
No se puede implementar cdigo adicional asociado a la Lectura o
Escritura de la variable.

Declarando un mtodo de acceso a la variable


Empobrece la legibilidad del cdigo. Puede crear confusin.

Utilizando accesadores get{ } y set { } para las propiedades


Recomendado en C#

59

Implementado propiedades con mtodos


de acceso
Es la nica opcin en algunos lenguajes de programacin orientados a objetos.
En C#.NET existe otra manera mas recomendable.
class Persona
{
private int edad;
public void EstablecerEdad(int a)
{
edad = a;
}
public int ConsultarEdad()
{
return edad;
}
}

class Programa
{
static void Main()
{
Persona unaPersona = new Persona();
unaPersona.EstablecerEdad(25);
System.Console.WriteLine
("La edad es: " +
unaPersona.ConsultarEdad());
}
}

60

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

30

Programacin Orientada a Objetos con C#

Implementando propiedades
con accesadores get, set
(Manera recomendada)

class Persona
{
private int edad;
public int Edad
{
get
{
return edad;
}
set
{
edad = value;
}
}
}

class Programa
{
static void Main()
{
Persona unaPersona = new Persona();
unaPersona.Edad = 25;
System.Console.WriteLine
(unaPersona.Edad);
}
}

61

Propiedades de solo lectura


Si se desea que una propiedad sea de solo lectura,
solo se debe incluir get.
class Cuenta
{ private double _saldo=0;
public double Saldo
{
get { return _saldo; }
}
}
class Programa
{
static void Main()
{
Cuenta miCuenta = new Cuenta();
//miCuenta.Saldo = 32;
System.Console.WriteLine(miCuenta.Saldo);
System.Console.ReadLine();
}
}

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

Realizar
una
asignacin
provocara
un error
62

31

Programacin Orientada a Objetos con C#

Nivel de acceso asimtrico en


las propiedades

Si una propiedad posee get y


set, entonces uno de los dos
puede tener un modificador de
acceso explcito.

El nivel de acceso explcito de get


o set debe ser mas restrictivo que
el usado en la propiedad a la que
pertenece.

No se pueden utilizar en interfaces


o implementacin de ellas.

get sigue siendo public


class Empleado
{
private int _numero;
public int Numero
{
get
{
return _numero;
}
private set
{
_numero = value;
}
}
}

63

Convenciones de nomenclatura
de los componentes de un
proyecto en C# .NET
http://www.itnuevolaredo.edu.mx/takeyas/A
puntes/POO/Apuntes/02.CodingConventionsCSharp.pdf

64

Dr. Ramn Roque Hernndez


M.C. Bruno Lpez Takeyas

32