Documentos de Académico
Documentos de Profesional
Documentos de Cultura
S 1 4 CSharp-POOv1 0
S 1 4 CSharp-POOv1 0
1. POO con C #
2. Algunas Clases útiles.
3. Gestión de Errores y Excepciones
4. El proyecto de Hoy
2
CEP "Lenguaje de Programación C#"- Curso 08/09
1. POO en C#
Relación entre Estructura y Clase
•Relación entre Estructura y Clase
Una estructura define un valor
• Sin identidad, estado accesible, sin comportamiento añadido
Una clase define un objeto
• Identidad, estado inaccesible, comportamiento añadido
• Los objetos representan mejor el mundo real, mientras que las
estructuras permiten representar simplemente agrupaciones
heterogéneas de datos.
Class Struct
Tipo Por Referencia Tipo Por Valor
Puede heredar de otras
No permite la herencia
clases
Puede tener un
No destructor
destructor
Puede tener
No puede tener constructores
constructores
sobrecargados
sobrecargados
3
CEP "Lenguaje de Programación C#"- Curso 08/09
1. POO en C#
Relación entre Clase y Objeto
4
CEP "Lenguaje de Programación C#"- Curso 08/09
1. POO en C#
Creación de Clases y Objetos
Persona
Persona Yo
Yo == new
new Persona(“
Persona(““Ismael”
Persona(
Persona(“ Ismael””);
Ismael
Ismael” );
yo ••
Objeto
Objeto con
con datos
datos sobre
sobre Ismael
Ismael
profesor ••
• Comparación de tipos valor
== and != comparan valores
• Comparación de tipos referencia
== and != comparan las referencias, no los valores
6
CEP "Lenguaje de Programación C#"- Curso 08/09
1. POO en C#
Creación de Clases y Objetos (III)
7
CEP "Lenguaje de Programación C#"- Curso 08/09
1. POO en C#
Creación de Clases y Objetos (IV)
• Sobre Los Métodos
Puede ser necesario
Tipos sobrecargarlos
• Constructores / Destructores
– Inicializan el estado de un objeto / Especifican que hay que hacer cuando
ya no se tienen referencias al objeto
• De Acceso a Datos
– ~ setXXX/getXXX Propiedades en C#
• De Lógica de Dominio
– Implementan las operaciones típicas del dominio
Aspectos Específicos
• Se puede sobrecargar y hay que especificar si se pueden/deben
sobre-escribir
– Hay que especificar si son virtuales (para definir la existencia un
comportamiento en clases bases) o no virtuales (para especificar cómo
se realiza un comportamiento en clases derivadas)
– Los virtuales pueden contener una especificación por defecto, o ninguna
y entonces ser abstractos (definidos en una clase abstracta)
– Los no-virtuales no pueden ser abstractos ni sirven para implementar el
polimofismo
8
CEP "Lenguaje de Programación C#"- Curso 08/09
1. POO en C#
Creación de Clases y Objetos (V)
public
publicclass
classPersona
Persona
{{
private
privatestring
stringnombre;
nombre;
public
public int Nombre{{
int Nombre
get
get{{return
returnnombre;
nombre;}}
set
set{{ifif(nombre
(nombre!=
!=NULL)
NULL)nombre
nombre==value;
value;
else
elsethrow
thrownew
newNombreInvalidoException();
NombreInvalidoException();}}
}}
private
privatestring
stringapellido1;
apellido1; Usamos la propiedad y
no los campos.
public string Apellido1;; {{
public string Apellido1
get
get{{return
returnthis.apellido1;
this.apellido1;}}
set
set{{this.apellido1=
this.apellido1=value;
value;}}
}}
public
publicPersona
Persona(string
(stringsNombre,
sNombre,string
stringsApellido1){
sApellido1){
this.Nombre = sNombre;
this.Nombre = sNombre;
this.Apellido1=
this.Apellido1=sApellido1;
sApellido1;
}}
public
publicPersona
Persona(string
(stringsNombre):
sNombre):this
this(sNombre,
(sNombre,“”)
“”){{}}
}}
9
CEP "Lenguaje de Programación C#"- Curso 08/09
1. POO en C#
Metáfora de POO
10
CEP "Lenguaje de Programación C#"- Curso 08/09
1. POO en C#
Miembros de Clases
11
CEP "Lenguaje de Programación C#"- Curso 08/09
1. POO en C#
Miembros de Clases
Indizadores
• Los indizadores permiten indizar un objeto de una manera
similar a como se hace con las matrices.
Constructores
• Se utilizan para inicializar el estado de un nuevo objeto.
Destructores
• Los destructores son métodos a los que llama el motor de
ejecución cuando el objeto está a punto de quitarse de la
memoria. Generalmente se utilizan para asegurarse de que
los recursos que se tienen que liberar se controlan
apropiadamente.
Tipos Anidados
• Los tipos anidados son tipos declarados dentro de una clase
o estructura. Los tipos anidados se utilizan a menudo para
describir objetos únicamente utilizados por los tipos que los
contienen.
12
CEP "Lenguaje de Programación C#"- Curso 08/09
1. POO en C#
Miembros estáticos vs miembros de instancia
13
CEP "Lenguaje de Programación C#"- Curso 08/09
1. POO en C#
Acceso a Miembros
Persona
Persona Yo
Yo == new
new Persona(“
Persona(““Ismael”
Persona(
Persona(“ Ismael””);
Ismael
Ismael” );
Yo.Apellido1
Yo.Apellido1 == ““Caballero”
Caballero””;;
Caballero
Caballero”
Yo.Apellido2
Yo.Apellido2 ==““Muñ
Muññoz-
Mu
Muñ oz--Reja”
oz
oz- Reja””;;
Reja
Reja”
Yo.CambiarEstado
Yo.CambiarEstado ((““Dormido”
Dormido””);
Dormido
Dormido” );
NombreReferencia.NombreMiembro
14
CEP "Lenguaje de Programación C#"- Curso 08/09
1. POO en C#
Pilares de POO
• Pilares de la OO
Encapsulamiento
• Ocultar al resto de las clases el estado de un
objeto
– Confiere seguridad
Herencia
• Poder compartir características y comportamiento
comunes enter clases de la misma familia
– Confiere posibilidad de clasificar y estructurar
Polimorfismo
• Poder compartir un mismo comportamiento por
clases de distinas famiilas
– Confiere la posibilidad de establecer y adherirse a
contratos (generalizar comportamientos)
15
CEP "Lenguaje de Programación C#"- Curso 08/09
1. POO en C#
Encapsulamiento
•Encapsulamiento
Son un conjunto de mecanismos para evitar que
cualquier otro objeto modifique el estado de un
objeto. Sólo un método específico (setXXX)
debería tener esta responsabilidad (ni siquiera los
constructores, que deberían invocarlos)
• Se consigue tener un único punto de acceso al valor
del atributo / campo, con lo que siempre se puede
asegurar dónde encontrar las reglas para mantener la
coherencia en el valor del atributo/campo
• Se implementa poniendo los modificadores de acceso
de tal manera que sean coherentes con los principios de
diseño
– Por ejemplo si pongo algo como privado no se puede
heredar
16
CEP "Lenguaje de Programación C#"- Curso 08/09
1. POO en C#
Encapsulamiento (II)
•Modificadores de Acceso
17
CEP "Lenguaje de Programación C#"- Curso 08/09
1. POO en C#
Herencia
•Herencia
Mecanismos de clasificación
•Tipos De Clases public abstract class SerVivo
Abstractas
• No puede ser instanciada, porque no tienen sentido
propiamente dicho
• Sirve como base para la herencia
• Puede contener métodos con y sin implementación
• No puede ser final public class Persona : SerVivo
Regulares
• Son las clases normales que se definen. Pueden heredar (o
extender) de otras clases y a su vez pueden ser base de
heredadas (o ser extendidas)
public sealed class Alumno :
Selladas (Sealed) o finales Persona
• Son clases que se definen para que no se puedan heredar de
ellas, bien por razones de diseño, bien por seguridad
18
CEP "Lenguaje de Programación C#"- Curso 08/09
1. POO en C#
Herencia (II)
Clase Base
class
class Persona
Persona Clase
{{ Derivada
...
... Clase Base
}}
class
class Alumno
Alumno :: Persona
Persona
{{
...
...
}} El extends de
C#
19
CEP "Lenguaje de Programación C#"- Curso 08/09
1. POO en C#
Herencia (III)
• Seleccionando qué se hereda
Los miembros heredados con protección están
implícitamente protegidos en la clase derivada
Los miembros de una clase derivada sólo pueden acceder
a sus miembros heredados con protección
• Redefinición de Métodos y propiedades
Con la palabra reservada new creo otra versión del
método heredado, ocultando al heredado
public
public class
class BaseC
BaseC {{
public
public int
int x;
x;
public
public void
void Invoke()
Invoke() {{ }}
}}
public
public class
class DerivedC
DerivedC :: BaseC
BaseC
{{
new
new int
int x;
x;
new
new public
public void
void Invoke()
Invoke() {{ }}
}}
20
CEP "Lenguaje de Programación C#"- Curso 08/09
1. POO en C#
Polimorfismo
•Polimorfismo
Un tipo puede sustituir a su supertipo
• Se pueden tener comportamientos mediante contratos
Para implementar polimorfismo se escogen los
métodos virtuales, que obligan a que en cada clase
derivada se tengan que sobre-escribir/reemplazar
class Figura {
public virtual void CalcularArea()
CalcularArea() { ... }
}
class Recuadro : Figura {
public override void CalcularArea()
CalcularArea() { ... }
}
class Esfera : Figura {
public override void CalcularArea()
CalcularArea() { ... }
}
21
CEP "Lenguaje de Programación C#"- Curso 08/09
1. POO en C#
Polimorfismo: Interfaces
22
CEP "Lenguaje de Programación C#"- Curso 08/09
1. POO en C#
Polimorfismo: Interfaces (II)
23
CEP "Lenguaje de Programación C#"- Curso 08/09
Sesión 1.4
Contenidos
1. POO con C #
2. Algunas Clases útiles.
3. Gestión de Errores y Excepciones
4. El proyecto de hoy
24
CEP "Lenguaje de Programación C#"- Curso 08/09
2. Algunas Clases Útiles
Principios de Diseño
•Filosofía de Diseño
Cada Clase debe tener una responsabilidad única
Se escribirán métodos para satisfacer esa
responsabilidad
Se seguirá el principio de “Máxima Coherencia y
Mínimo Acoplamiento”
25
CEP "Lenguaje de Programación C#"- Curso 08/09
2. Algunas Clases Útiles
Modelo de Tres Capas
26
CEP "Lenguaje de Programación C#"- Curso 08/09
2. Algunas Clases Útiles
Espacios de Nombres
•Espacios de Nombres
La palabra clave namespace se utiliza para declarar
un ámbito.
Este ámbito permite organizar el código y proporciona
una forma de crear tipos globalmente únicos.
Dos formas de usarse:
• Primero, las clases de .NET Framework utilizan los
espacios de nombres para organizar clases.
• Segundo, declarar sus propios espacios de nombres
permite ayudar a controlar el ámbito de la clase y los
nombres de método en proyectos de programación de
mayor tamaño.
Incorporar los que sean accesibles con using.
Se pueden anidar creando estructuras
Se pueden usar alias.
27
CEP "Lenguaje de Programación C#"- Curso 08/09
2. Algunas Clases Útiles
Espacios de Nombres (II)
namespace N1 // N1
{
class C1 // N1.C1
{
Una forma de
class C2 // N1.C1.C2 organizar las clases
{ del Modelo de Tres
} Capas
}
namespace N2 // N1.N2
{
class C2 // N1.N2.C2
{
} using N1;
} namespace N3 {
} class D1 {
C1 uC1= new C1 ();
}
}
28
CEP "Lenguaje de Programación C#"- Curso 08/09
2. Algunas Clases Útiles
La clase System.Console
•Generalidades
Permite interactuar con la consola
• Lectura: Métodos Read, ReadLine
– Leen siempre una cadena de caracteres. Si se desea otro tipo de
datos, habrá que hacer la conversión mediante XXX.Parse(), que
puede generar excepciones
• Escritura: Métodos Write, WriteLine
– Admite diferentes formatos según la naturaleza de lo que se imprima
c 7.612,94€ f 7612,94
dd 07 ddd lun
29
CEP "Lenguaje de Programación C#"- Curso 08/09
2. Algunas Clases Útiles
La clase System.Console (II)
class Sample Console.WriteLine("Standard DateTime Format
{ Specifiers");
enum Color {Yellow = 1, Blue, Green}; Console.WriteLine(
static DateTime thisDate = DateTime.Now; "(d) Short date: . . . . . . . {0:d}\n" +
"(D) Long date:. . . . . . . . {0:D}\n" +
public static void Main() "(t) Short time: . . . . . . . {0:t}\n" +
{ "(T) Long time:. . . . . . . . {0:T}\n" +
Console.Clear(); "(f) Full date/short time: . . {0:f}\n" +
"(F) Full date/long time:. . . {0:F}\n" +
// Format a negative integer or floating-point "(g) General date/short time:. {0:g}\n" +
// number in various ways. "(G) General date/long time: . {0:G}\n" +
Console.WriteLine("Standard Numeric Format " (default):. . . . . . . . {0} (default = 'G')\n" +
Specifiers"); "(M) Month:. . . . . . . . . . {0:M}\n" +
Console.WriteLine( "(R) RFC1123:. . . . . . . . . {0:R}\n" +
"(C) Currency: . . . . . . . . {0:C}\n" + "(s) Sortable: . . . . . . . . {0:s}\n" +
"(D) Decimal:. . . . . . . . . {0:D}\n" + "(u) Universal sortable: . . . {0:u} (invariant)\n" +
"(E) Scientific: . . . . . . . {1:E}\n" + "(U) Universal full date/time: {0:U}\n" +
"(F) Fixed point:. . . . . . . {1:F}\n" + "(Y) Year: . . . . . . . . . . {0:Y}\n",
"(G) General:. . . . . . . . . {0:G}\n" + thisDate);
" (default):. . . . . . . . {0} (default = 'G')\n" + Console.WriteLine("Standard Enumeration Format
"(N) Number: . . . . . . . . . {0:N}\n" + Specifiers");
"(P) Percent:. . . . . . . . . {1:P}\n" + Console.WriteLine(
"(R) Round-trip: . . . . . . . {1:R}\n" + "(G) General:. . . . . . . . . {0:G}\n" +
"(X) Hexadecimal:. . . . . . . {0:X}\n", " (default):. . . . . . . . {0} (default = 'G')\n" +
-123, -123.45f); "(F) Flags:. . . . . . . . . . {0:F} (flags or integer)\n" +
"(D) Decimal number: . . . . . {0:D}\n" +
"(X) Hexadecimal:. . . . . . . {0:X}\n",
Color.Green);
}
}
30
CEP "Lenguaje de Programación C#"- Curso 08/09
2. Algunas Clases Útiles
La clase string
• La clase string
Es un tipo por referencia
• No se pueden hacer comparaciones directas!
Proporciona los siguientes métodos
• bool Contains (string str)
• bool EndsWith (string str)
• int IndexOf(Char ch)
• string [ ] Split (params char [] sep):
– rompe una cadena en varias partes usando sep como
separador
• ToLower()
• ToUpper()
• …
31
CEP "Lenguaje de Programación C#"- Curso 08/09
2. Algunas Clases Útiles
La clase Math
• Generalidades
Proporciona muchos métodos estáticos y constantes para
la realización de cálcuos matemáticos
• Math.PI
• double Abs(double x)
• double Ceiling(double x)
• double Cos(double x)
• double Exp(double x)
• double Floor(double x)
• double Log(double x)
• double Pow(double x, double y)
• double Sqrt(double x)
• double Tan(double x)
32
CEP "Lenguaje de Programación C#"- Curso 08/09
2. Algunas Clases Útiles
La clase Convert
• Generalidades
Todas las estructuras que representan los tipos básicos
del lenguaje tienen un método TryParse que permite
transformar strings en objetos del tipo correspondiente.
33
CEP "Lenguaje de Programación C#"- Curso 08/09
2. Algunas Clases Útiles
La estructura DateTime
• Uso
Para manejar fechas y horas
• Algunas Propiedades
int Day
int Hour
int Minute
DateTime Now
int Second
int Year
• Algunos Métodos
string ToLongDateString() / ToShortDateString ()
String ToLongTimeString() / ToShortTimeString()
DateTime Parse()
…
34
CEP "Lenguaje de Programación C#"- Curso 08/09
2. Algunas Clases Útiles
Clases Genéricas
public
public class
class Contenedor<T>{
Contenedor<T>{
IList<T>
IList<T> list;
list;
public
public Contenedor(){
Contenedor(){ list=
list= new
new List<T>();
List<T>(); }}
public
public void
void Add(params
Add(params T[]
T[] items{
items{
foreach
foreach (T
(T tt in
in items)
items) list.Add(t);
list.Add(t);
public
public void
void Remove
Remove (T
(T item){
item){
list.Remove
list.Remove (item);
(item);
}}
35
CEP "Lenguaje de Programación C#"- Curso 08/09
2. Algunas Clases Útiles
Clases Genéricas (II)
Libro
Libro B1,
B1, B2;
B2;
Contenedor<Libro>
Contenedor<Libro> MiBiblio;
MiBiblio;
B1=
B1= new
new Libro();
Libro();
B2=
B2= new
new Libro();
Libro();
MiBiblio
MiBiblio == new
new Contenedor<Libro>();
Contenedor<Libro>();
MiBiblio.Add(B1);
MiBiblio.Add(B1);
MiBiblio.Add(B2);
MiBiblio.Add(B2);
MiBiblio.Add(“Harry
MiBiblio.Add(“Harry Potter”);
Potter”);
Disco
Disco D1,
D1, D2;
D2;
Contenedor<Disco>
Contenedor<Disco> MiDisco;
MiDisco;
D1=
D1= new
new Disco();
Disco();
D2=
D2= new
new Disco();
Disco();
MiDisco
MiDisco == new
new Contenedor<Disco>();
Contenedor<Disco>();
MiDisco.Add(D1);
MiDisco.Add(D1);
MiDisco.Add(D2);
MiDisco.Add(D2);
36
CEP "Lenguaje de Programación C#"- Curso 08/09
2. Algunas Clases Útiles
El espacio System.Collections.Generics
• System.Collections.Generics
37
CEP "Lenguaje de Programación C#"- Curso 08/09
2. Algunas Clases Útiles
El espacio System.Collections.Generics (II)
• Interfaz ICollection<T>
Define los miembros comunesde todas las estructuras de
datos que proporciona .NET
• Propiedades
– int Count
– bool IsReadOnly
• Métodos
– void Add(T obj)
– void Clear ()
– bool Contains (T obj)
– void CopyTo(T[] target, int index)
– bool Remove (T obj)
– …
38
CEP "Lenguaje de Programación C#"- Curso 08/09
2. Algunas Clases Útiles
El espacio System.Collections.Generics (II)
• Interfaz IList<T>
Colecciones donde la posición es significativa
Métodos
• int IndexOf(T obj)
• void Insert (int index, T obj)
• void RemoveAt (int index)
• …
• Interfaz IDictionary<T,Q>
Colección de datos identificados por unas claves que
deben ser únicas
Métodos
• Void Add(T key, Q value)
• Bool ContainsKey (T key)
• Bool Remove(T Key)
• …
39
CEP "Lenguaje de Programación C#"- Curso 08/09
Sesión 1.4.
Contenidos
1. POO con C #
2. Algunas Clases útiles.
3. Gestión de Errores y Excepciones
4. El proyecto de hoy
40
CEP "Lenguaje de Programación C#"- Curso 08/09
3. Gestión de Errores y Excepciones
Control de Excepciones
Exception
Exception
SystemException
SystemException
OutOfMemoryException
OutOfMemoryException
IOException
IOException
NullReferenceException
NullReferenceException
ApplicationException
ApplicationException
41
CEP "Lenguaje de Programación C#"- Curso 08/09
3. Gestión de Errores y Excepciones
Control de Excepciones
•Control de Excepciones
try {
// Código optimista .
} catch (System.Exception
(System.Exception ex1) {
// Codigo para gestionar la ex1
} catch (System.Exception
(System.Exception ex2) {
// Codigo para gestionar la ex2
}
…
finally {
// Código final aquí
}
42
CEP "Lenguaje de Programación C#"- Curso 08/09
3. Gestión de Errores y Excepciones
Definir Nuevas Excepciones
public class ValorNoValidoException : Exception {
public ValorNoValidoException () {}
public ValorNoValidoException (string message) {}
public ValorNoValidoException (string message,
System.Exception inner) {}
}
public
publicclass
classPersona
Persona
{{
private
privateint intnombre;
nombre;
public
publicintintNombre
Nombre
{{
get
get{{return
returnnombre;
nombre;}}
set
set{{
ifif(nombre
(nombre!=!=null)
null)nombre
nombre==value;
value;
else
elsethrow
thrownew
newValorNoValidoException();
ValorNoValidoException();
}}
}}
}}
43
CEP "Lenguaje de Programación C#"- Curso 08/09
Sesión 1.4.
Contenidos
1. POO con C #
2. Algunas Clases útiles.
3. Gestión de Errores y Excepciones
4. El proyecto de Hoy
44
CEP "Lenguaje de Programación C#"- Curso 08/09
4. El proyecto de Hoy
Versiones de un programa
45
CEP "Lenguaje de Programación C#"- Curso 08/09