POO Con Csharp
POO Con Csharp
POO Con Csharp
C# (I)
Marco A. Peña
marcoa@ac.upc.es
Índice de contenidos
Encapsulación
Clases y objetos
Variables de tipo referencia
Clases y constructores
Más sobre Métodos
Clases y espacios de nombres comunes en C#/.NET
1
Abstracción → Encapsulación
Encapsulación
z Quien programa un objeto controla los métodos de acceso a su
estado y su comportamiento
z El programador puede (y debe) responsabilizarse de la corrección
del código correspondiente a un objeto → “compromiso
contractual”
Retirar( ) Retirar( )
saldo saldo
Ingresar( ) Ingresar( )
¿CuentaBancaria ? ¿CuentaBancaria ?
2
Encapsulación: control de acceso
Retirar( ) Retirar( )
saldo 8 saldo
Ingresar( ) Ingresar( )
¿CuentaBancaria ? ¿CuentaBancaria ?
Retirar( ) Retirar( )
Ingresar( ) Ingresar( )
céntimos 56
3
Encapsulación: datos estáticos (I)
Retirar( ) Retirar( )
Ingresar( ) Ingresar( )
saldo 12,56 saldo 12,56
prop. “Juan" prop. “Pedro"
Retirar( ) Retirar( )
Ingresar( ) Ingresar( )
saldo 12,56 saldo 12,56
interés 7% 8 interés 7% 8
4
Encapsulación: métodos estáticos
Retirar( )
Interés( )
8 Ingresar( )
9 saldo 99,12
interés 7% 8 prop. “Pedro"
Índice de contenidos
Encapsulación
Clases y objetos
Variables de tipo referencia
Clases y constructores
Más sobre Métodos
Clases y espacios de nombres comunes en C#/.NET
5
Programación Orientada a Objetos
Partición en objetos
6
Objetos
Un objeto es básicamente:
z Los datos (variables) que representan una “entidad”
z Las operaciones (funciones) que actúan sobre estos datos,
consultando o modificando el estado del objeto
int dni
Datos String nombre
String direccion
int telefono
Clases de objetos
7
Representación gráfica
Una clase Un objeto
Atributos Atributos
nombre
nombre
Características de la Estado particular de
nombre
clase: lo que se es o cada objeto
nombre
cómo se está
...
Circulo }
double dameRadio () {
radio: double return radio;
}
Circulo: double area () {
dameRadio: double return (Math.PI * radio * radio);
area: double
circunferencia: double }
escala: void double circunferencia () {
return (2 * Math.PI * radio);
}
void escala (double proporcion) {
radio = radio * proporcion;
}
}
LPII: Laboratorio de Programación II 19
8
Composición
p1 p2
p4 p3
Rectangulo
Punto
p1: Punto
x: double
p2: Punto
y: double
p3: Punto
Punto: p4: Punto
distancia: double
Rectangulo:
Rectangulo:
area: double
Composición
class Punto { class Rectangulo {
double x, y; Punto p1, p2, p3, p4;
Punto (double _x, double _y) Rectangulo (Punto _p1, Punto _p2,
{ Punto _p3, Punto _p4)
x = _x; {
y = _y; p1 = _p1; p2 = _p2;
} p3 = _p3; p4 = _p4;
void desplaza (double dX, double dY) }
{ Rectangulo (double b, double a)
x = x + dX; {
y = y + dY; p1 = new Punto(0.0, a);
} p2 = new Punto(b, a);
double distancia (Punto Q) { ... } p3 = new Punto(0.0, 0.0);
} p4 = new Punto(b, 0.0);
}
double area () { ... }
LPII: Laboratorio de Programación II } 21
9
Índice de contenidos
Encapsulación
Clases y objetos
Tipos valor
z La variable contiene el valor directamente: char, int, ...
int
int mol;
mol;
mol 42
42
mol == 42;
42;
Tipos referencia
z La variable contiene una referencia al dato
z El dato se almacena en un área de memoria aparte
string
string mol;
mol;
mol
mol == “Hola";
“Hola"; •• Hola
Hola
10
Declaración y liberación de referencias
coordenada
coordenada c1;c1;
c1
c1 == new
new coordenada();
c1.x
coordenada();
c1.x == 6.12;
6.12;
•• 6.12
6.12 4.2
4.2
c1.y
c1.y == 4.2;
4.2;
c1
c1 == null;
null; •• 6.12
6.12 4.2
4.2
Referencias no válidas
11
Referencias como parámetros
22 33 33 44
•• cc
static
static void
void PassCoordinateByValue(coordenada
PassCoordinateByValue(coordenada c)
c)
{{
c.x++;
c.x++; c.y++;
c.y++;
}}
loc.x
loc.x == 2;
2; loc.y
loc.y == 3;
3;
PassCoordinateByValue(loc); •• locloc
PassCoordinateByValue(loc);
Console.WriteLine(loc.x
Console.WriteLine(loc.x ++ "" ,, "" ++ loc.y);
loc.y);
Referencias y objetos
c1 Circulo c2 Circulo
1.0 3.5
Circulo Circulo
dameRadio dameRadio
area area
circunferencia circunferencia
escala escala
12
Acceso a atributos y métodos
Ejemplos:
z c1.dameRadio(); // 1.0
z c2.dameRadio(); // 3.5
z c1.area(); // 3.1416
z c2.area(); // 38.4846
z c1.escala(2.0);
z c1.area(); // 12.5664
1.0
c1.area(); // 3.1416
Circulo c2.area(); // 3.1416
dameRadio
area
circunferencia c1.escala(2.0);
c2 escala c2.area(); // 12.5664
13
Comparación
Se comparan referencias
z Cierto si ambas referencian el mismo objeto
No se comparan los objetos
z False incluso si son dos objetos iguales en todo
null
Circulo c1;
c1.area(); // Error!
c1 = new Circulo(1.0);
c1.area(); // 3.1416
c1 = null;
c1.area(); // Error!
14
Des-referenciación
Índice de contenidos
Encapsulación
Clases y objetos
Variables de tipo referencia
Clases y constructores
Más sobre Métodos
Clases y espacios de nombres comunes en C#/.NET
15
¿Qué es una clase?
Una clase en C#
using System;
16
Instanciación y constructores
Constructores
17
Constructor por defecto
Acceso público
Mismo nombre que la clase
No tiene tipo de retorno (ni siquiera void)
No recibe ningún argumento
Inicializa todos los campos a cero, false o null
Sintaxis del constructor por defecto
class Persona {
...
public Persona( ) {
...
}
...
}
LPII: Laboratorio de Programación II 40
Otros constructores
18
Sobrecarga de constructores
19
Referencias y this
class
class CuentaBancaria
CuentaBancaria
{{
...
...
public
public void
void PoneNombre(string
PoneNombre(string nombre)
nombre)
{{ Si esta instrucción fuera
nombre = nombre;
this.nombre
this.nombre == nombre;
nombre; ¿qué ocurriría?
}}
private
private string
string nombre;
nombre;
}}
20
Recolección de basura
Control de acceso
21
Control de acceso
Control de acceso
class
class CuentaBancaria
CuentaBancaria
{{ Métodos
Métodos públicos
públicos
describen
describen un
un
public
public void
void Retirar(decimal
Retirar(decimal cantidad)
cantidad) comportamiento
comportamiento
{{ ... }
... } accesible
accesible
public
public void
void Ingresar(decimal
Ingresar(decimal cantidad)
cantidad)
{{ ... }
... } Campos
Campos privados
privados
private
private decimal
decimal saldo;
saldo; describen
describen unun
private
private string nombre;
string nombre; estado
estado
}} inaccesible
inaccesible
22
Elementos de clase
Los métodos de una clase son compartidos por todos los objetos
de esa clase
z Los métodos static
9 Se pueden llamar referidos a la clase
9 No hace falta crear un objeto para poder llamarlos
9 No puede trabajar sino sobre atributos static pues los atributos
normales no están creados
23
Atributos y métodos de clase
class
class CuentaBancaria
CuentaBancaria
{{
static
static float
float interes;
interes;
private
private decimal
decimal saldo;
saldo;
static
static void
void FijarInteres(float
FijarInteres(float pct)
pct) Métodos
Métodos estáticos
estáticos
{{ sólo
sólo acceden
acceden aa
datos
datos estáticos
estáticos
interes
interes == pct;
pct;
}}
public
public void
void Retirar(decimal
Retirar(decimal cantidad)
cantidad)
{{ ...
... }}
public
public void
void Ingresar(decimal
Ingresar(decimal cantidad)
cantidad)
{{ ...
... }}
}}
Índice de contenidos
Encapsulación
Clases y objetos
Variables de tipo referencia
Clases y constructores
24
Paso de objetos como parámetro
class
class Punto
Punto {{
int
int x, y;
x, y;
Punto
Punto (int
(int _x,
_x, int
int _y)
_y) {{ x=
x= _x;
_x; y=
y= _y;
_y; }}
void
void escala (int s) { x*= s; y*= s; }}
escala (int s) { x*= s; y*= s;
void
void muestra
muestra ()
() {{
System.Console.WriteLine(“x=
System.Console.WriteLine(“x= ““ ++ x); x);
System.Console.WriteLine(“y=
System.Console.WriteLine(“y= ““ ++ y); y);
}}
...
...
LPII: Laboratorio de Programación II 56
...
...
void
void mm (Punto
(Punto p)
p) {{
p.escala(2);
p.escala(2);
}}
}}
Punto
Punto a=
a= new
new Punto(3,
Punto(3, 4);
4);
a.muestra();
a.muestra(); // 3,
// 3, 44
m(a);
m(a); //
// se
se pasa
pasa la
la referencia
referencia
a.muestra(); // 6,
a.muestra(); // 6, 8 8
25
Ámbitos
Variables automáticas
26
Ámbito de variables
class
class Punto
Punto {{
public
public float
float distancia
distancia (Punto
(Punto p)
p) {{
double xdiff = x -
double xdiff = x - p.x;p.x;
double
double ydiff
ydiff == yy -- p.y;
p.y;
xdiff
ydiff
x, y
return
return Math.sqrt (xdiff*xdiff
Math.sqrt (xdiff*xdiff ++
p
ydiff*ydiff)
ydiff*ydiff)
}}
double
double x,
x, y;
y;
}}
Ámbito dinámico
27
Listas de parámetros de longitud variable
static
static long
long AddList(params
AddList(params long[long[ ]] v)
v)
{{
long
long total,
total, i; i;
for
for (i
(i == 0,
0, total
total == 0;
0; ii << v.Length;
v.Length; i++)
i++)
total += v[i];
total += v[i];
return
return total;
total;
}}
static
static void
void Main(
Main( ))
{{
long
long xx == AddList(63,21,84);
AddList(63,21,84);
}}
class
class OverloadingExample
OverloadingExample
{{
static
static int
int Suma(int
Suma(int a, a, int
int b)
b)
{{
return
return aa ++ b;
b;
}}
static
static int
int Suma(int
Suma(int a, a, int
int b,
b, int
int c)
c)
{{
return
return aa ++ bb ++ c;
c;
}}
static
static void
void Main(
Main( ))
{{
Console.WriteLine(Suma(1,2)
Console.WriteLine(Suma(1,2) ++ Suma(1,2,3));
Suma(1,2,3));
}}
}}
28
Programas en C#: método Main
p.modificarDni(1234567);
p.mostrarPorPantalla();
Índice de contenidos
Encapsulación
Clases y objetos
Variables de tipo referencia
Clases y constructores
Más sobre Métodos
29
Clase Exception
Clase String
string
string ss == "Hola";
"Hola";
30
Clase String
Sinónimo de System.Object
Clase base para todas las demás clases
Object
Object
String
String Exception
Exception MyClass
MyClass
SystemException
SystemException
31
Espacios de nombre en .NET
Preguntas y respuestas
32