Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Unidad I:
Elaborado por:
TABLA DE CONTENIDOS
Contenido
1. Introducción a la POO ..................................................................................................................... 3
1.1. Introducción ............................................................................................................................ 3
1.2. Pensar en objetos ................................................................................................................... 4
1.3. Clases y objetos ....................................................................................................................... 4
1.4. Mensajes y métodos ............................................................................................................... 6
1.5. Diseño de una clase de objetos .............................................................................................. 7
1.6. Atributos ................................................................................................................................. 8
1.7. Propiedades y métodos .......................................................................................................... 9
1.8. Constructores ........................................................................................................................ 14
1.9. Herencia ................................................................................................................................ 17
2. El Lenguaje C# ............................................................................................................................... 22
2.1. Introducción .......................................................................................................................... 22
2.2. Estructura de los programas ................................................................................................. 23
2.3. Tipos de datos ....................................................................................................................... 24
2.4. Identificadores ...................................................................................................................... 25
2.5. Variables................................................................................................................................ 26
2.6. Operadores y Expresiones .................................................................................................... 31
2.7. Arrays .................................................................................................................................... 33
2.8. Caracteres y cadenas ............................................................................................................ 34
3. Bibliografía .................................................................................................................................... 35
1. Introducción a la POO
1.1. Introducción
ligados mediante mensajes, para la solución de problemas. La idea central es simple: organizar los
¿A qué objetos nos referimos? Si nos paramos a pensar en un determinado problema que
intentamos resolver podremos identificar entidades de interés, las cuales pueden ser objetos
mediante los cuales muestran su comportamiento. Y no sólo eso, también podremos ver, a poco que
nos fijemos, un conjunto de interrelaciones entre ellos conducidas por mensajes a los que
Veamos un ejemplo. Considere una entidad bancaria. En ella identificamos entidades que son
cuentas: cuenta del cliente 1, cuenta del cliente 2, etc. Pues bien, una cuenta puede verse como un
objeto que tiene unos atributos, nombre, número de cuenta y saldo, y un conjunto de métodos
una transferencia:
cuenta01.Transferencia(cuenta02);
Transferencia sería el mensaje que el objeto cuenta02 envía al objeto cuenta01, solicitando le
sea hecha una transferencia, siendo la respuesta a tal mensaje la ejecución del método
Transferencia. Trabajando a este nivel de abstracción, manipular una entidad bancaria resultará muy
sencillo.
Usted podría pensar en un programa como si fuera una lista de instrucciones que le indican a la
máquina qué hacer. En cambio, desde la POO un programa es un conjunto de objetos que dialogan
pensemos en una concreta: XYZ. Podemos ver a esta entidad como a un objeto que tiene que
comunicarse con otros muchos objetos (bolsa, otras entidades bancarias, empresas, etc.) para lograr
sus fines: ganar dinero. A su vez, la entidad XYZ tendrá un montón de sucursales distribuidas por
toda la geografía. Cada sucursal es otro objeto, de diferentes características que la entidad bancaria,
que se comunicará con otras sucursales para satisfacer las peticiones de sus clientes. Pero, ¿y qué es
un cliente? Pues otro objeto con sus propias características que se comunicará con otros objetos
(sucursales, otros clientes, empresas, etc.) para realizar operaciones desde sus cuentas
(transferencias, cargos, ingresos, etc.). Pero y las cuentas, ¿no son también objetos? Evidentemente.
Vemos entonces que escribir un programa de gestión para el banco XYZ supondría crear objetos
banco, sucursal, cliente, cuenta, etc., que deben comunicarse entre sí para poder responder a las
Del ejemplo expuesto anteriormente podemos deducir que la P00 se basa en la observación de
que, en el mundo real, los objetos se construyen a partir de otros objetos. La combinación de estos
¿Qué es una clase de objetos? Pongamos un ejemplo: piense en un molde para hacer flanes; el
molde es la clase y los flanes, los objetos. Esto es, si disponemos de un molde de un litro para hacer
flanes de vainilla (ingredientes: leche, vainilla, azúcar, etc.), el molde agrupa las propiedades
comunes a todos los flanes de vainilla, pero no todos los flanes tienen por qué tener la misma
cantidad de cada ingrediente. Esto es, una clase equivale a la generalización de un tipo específico de
objetos, pero cada objeto que construyamos de esa clase tendrá sus propios datos.
Un objeto de una determinada clase se crea en el momento en que se invoca al operador new
para dicha clase. Por ejemplo, la siguiente línea crea un objeto de la clase o tipo CCuenta y asigna a
que una instancia es la representación concreta y específica de una clase; por ejemplo, cuenta01 es
una instancia de la clase CCuenta. Desde este punto de vista, los términos instancia y objeto son lo
mismo. En este libro se prefiere, no obstante, utilizar el término objeto, o bien ejemplar.
objetos verdaderos, se definen clases de objetos, donde una clase se ve como una plantilla para
múltiples objetos con características similares. Afortunadamente no tendrá que escribir todas las
clases que necesite en su programa, porque .NET proporciona una biblioteca de clases estándar para
Un programa orientado a objetos se compone solamente de objetos. Cada uno de ellos es una
entidad que tiene unas propiedades particulares, los atributos, y unas formas de operar sobre ellos,
los métodos.
Por ejemplo, una ventana de una aplicación Windows es un objeto. El color de fondo, la
anchura, la altura, etc., son atributos. Las rutinas, lógicamente transparentes al usuario, que
Cuando se ejecuta un programa orientado a objetos, los objetos están recibiendo, interpretando
y respondiendo a mensajes de otros objetos. En la P00 un mensaje está asociado con un método, de
tal forma que cuando un objeto recibe un mensaje la respuesta a ese mensaje es ejecutar el método
asociado.
Por ejemplo, cuando un usuario quiere maximizar una ventana de una aplicación Windows, lo
que hace simplemente es pulsar el botón de la misma que realiza esa acción. Eso provoca que
Windows envíe un mensaje a la ventana para indicar que tiene que maximizarse. Como respuesta a
Un método se escribe en una clase de objetos y determina cómo tiene que actuar el objeto
cuando recibe el mensaje vinculado con ese método. A su vez, un método puede también enviar
mensajes a otros objetos solicitando una acción o información. En adición, los atributos definidos en
Según lo expuesto, podemos decir que la ejecución de un programa orientado a objetos realiza
2. Los mensajes enviados a unos y a otros objetos dan lugar a que se procese internamente
la información.
clases, desde las cuales se crearán los objetos necesarios cuando el programa se ejecute. Cada una
de estas clases incluye dos partes fácilmente diferenciables: los atributos y los métodos. Los
atributos definen el estado de cada uno de los objetos de esa clase y los métodos, su
comportamiento.
Normalmente, los atributos, la estructura más interna del objeto, se ocultan a los usuarios del
objeto, manteniendo como única conexión con el exterior, los mensajes. Esto quiere decir que los
atributos de un objeto solamente podrán ser manipulados por los métodos del propio objeto. Este
Escribamos una clase de objetos. Siguiendo el ejemplo comentado, podemos crear una clase de
class CCuenta {
Observamos que para declarar una clase hay que utilizar la palabra reservada class seguida del
nombre de la clase y del cuerpo de la misma. El cuerpo de la clase incluirá entre { y } sus miembros:
atributos y métodos.
1.6. Atributos
Los atributos son las características individuales que diferencian un objeto de otro. El color de
una ventana Windows la diferencia de otras; la cédula de una persona la identifica frente a otras; el
número de una cuenta la distingue entre otras; etc. Pensando en la clase de objetos CCuenta,
elegimos los atributos de interés que van a definir esta clase de objetos:
class CCuenta {
//…
Observe que se han definido cuatro atributos: dos de ellos, nombre y cuenta, pueden contener
una cadena de caracteres (una cadena de caracteres es un objeto de la clase String perteneciente a
la biblioteca .NET). Los otros dos atributos, saldo y tipoDeInteres, son de tipo double. Recuerde que,
en lo sucesivo, cuando utilice estos identificadores, debe respetar las mayúsculas y las minúsculas.
Un usuario que utilice la clase CCuenta en su programa no podrá escribir su código basado
directamente en estos atributos, sino que tendrá que acceder a ellos a través de los métodos que
implemente la clase; de esta forma, un usuario de la clase CCuenta no podrá asignar cualquier valor
utilizan los modificadores private o public). Un miembro declarado privado (private) es accesible
solamente por los métodos de su propia clase. Esto significa que no se puede acceder a él por los
El comportamiento de un objeto queda definido por las acciones que puede emprender.
Por ejemplo, pensando acerca de un objeto de la clase CCuenta, esto es, de una cuenta de un
cliente de un determinado banco, algunas acciones que se pueden realizar sobre ella son:
• Realizar un ingreso.
• Realizar un reintegro.
Para definir este comportamiento se pueden utilizar tanto métodos como propiedades. En
general, los métodos representan acciones que un objeto puede realizar, mientras que las
Según esto, nombre, número de la cuenta, tipo de interés y saldo podrían considerarse
con otros lenguajes (por ejemplo, con C++) todas las acciones enumeradas anteriormente podrían
Los métodos son rutinas de código definidas dentro del cuerpo de la clase, que se ejecutan en
respuesta a alguna acción tomada desde dentro de un objeto de esa clase, o bien desde otro objeto
de la misma o de otra clase. Recuerde que los objetos se comunican mediante mensajes. El conjunto
de mensajes a los que un objeto puede responder se corresponde con el conjunto de métodos que
implementa su clase.
Como ejemplo, agregaremos a la clase CCuenta un método que responda a la acción de asignar
if (nom.Length == 0) {
return;
nombre = nom;
Observe que el método ha sido declarado público (public). Un miembro declarado público está
accesible para cualquier otra clase o subclase que necesite utilizarlo. La interfaz pública de una clase,
o simplemente interfaz, está formada por todos los miembros públicos de la misma.
Como se puede observar, un método consta de su nombre precedido por el tipo del valor que
devuelve cuando finalice su ejecución (la palabra reservada void indica que el método no devuelve
ningún valor) y seguido por una lista de parámetros separados por comas y encerrados entre
paréntesis (en el ejemplo, hay un parámetro nom). Los paréntesis indican a C# que el identificador,
El método asignarNombre asegura que el nombre a asignar no sea una cadena vacía (la
propiedad Length de la clase String contiene el número de caracteres que hay almacenados en el
objeto String que recibe ese mensaje); si el nombre fuera una cadena vacía, simplemente visualizaría
un mensaje que lo indicase; en otro caso, asigna la cadena nom pasada como argumento al atributo
Cuando decimos que un objeto recibe un mensaje, debemos entender que el mensaje es un
concepto que subyace en nuestra mente; la acción real es invocar al método que responde a ese
mensaje con el fin de modificar el estado del objeto. Según esto, podemos decir que los nombres de
los métodos de una clase forman el conjunto de mensajes a los que un objeto de esa clase puede
responder.
Agreguemos dos métodos más: uno que permita obtener el nombre de un cliente del banco y
return nombre;
return saldo;
Las propiedades tienen un aspecto análogo a un método. Utilizan descriptores de acceso para
controlar cómo se establecen y devuelven valores de los atributos a los que se refieren. Estos
descriptores de acceso son rutinas de código declaradas dentro de la propiedad para recuperar (get)
get {
set {
El cuerpo del descriptor de acceso get debe devolver el valor del tipo de la propiedad. La
ejecución del descriptor de acceso get equivale a leer el valor del atributo al que se refiere la
propiedad. El descriptor de acceso set utiliza un parámetro implícito denominado value, que tiene el
Como ejemplo, vamos a implementar las propiedades que podrían sustituir a los métodos que
get {
return nombre;
set {
if (value.Length == 0) {
return;
nombre = value;
Observe que la propiedad ha sido declarada pública (public). La explicación es la misma que
hemos dado para los métodos. Fíjese también que a través de set aseguramos que el nombre a
asignar no sea una cadena vacía; si el nombre fuera una cadena vacía, simplemente visualizará un
mensaje indicándolo; en otro caso, asignará la cadena value al atributo nombre del objeto. A través
Normalmente los descriptores de acceso de una propiedad se definen por parejas, utilizando get
y set. Ahora bien, si la propiedad es de sólo lectura (sólo get) o de sólo escritura (sólo set) puede
Por ejemplo, parece lógico que la propiedad que permita obtener el saldo de una cuenta, sea de
sólo lectura:
Para poder crear objetos de esta clase y trabajar con ellos, tendremos que escribir un programa.
En un programa tiene que haber una clase con un método Main, puesto que éste es el punto de
sintaxis siguiente:
nombre_objeto.nombre_miembro
Cualquier método de una clase tiene acceso (puede invocar) a todos los otros miembros
Un objeto de una clase sólo puede invocar a métodos de su clase; o sea, sólo puede responder a
1.8. Constructores
Se distingue fácilmente porque tiene el mismo nombre que la clase a la que pertenece y no
puede retornar un valor (ni siquiera se puede especificar la palabra reservada void). Por ejemplo,
public CCuenta() { }
Cuando en una clase no escribimos explícitamente un constructor, C# asume uno por omisión.
Un constructor por omisión de una clase C es un constructor sin parámetros que no hace nada.
Sin embargo, es necesario porque será invocado cada vez que se construya un objeto sin especificar
ningún argumento, en cuyo caso el objeto será iniciado con los valores predeterminados por el
sistema (los atributos numéricos a ceros, los alfanuméricos a nulos, y las referencias a objetos a
null).
En el siguiente ejemplo, añadimos un constructor a la clase CCuenta con el fin de poder iniciar
los atributos de cada nuevo objeto con unos valores determinados pasados como argumentos
cuando se crea:
public CCuenta (string nom, string cue, double sal, double tipo)
Nombre = nom;
Cuenta = cue;
ingreso(sal);
TipoDeInteres = tipo;
(constructor por omisión) es reemplazado por éste. Por eso hemos tenido que definirlo también
explícitamente, de lo contrario, intentar crear un objeto sin especificar parámetros daría lugar a un
error.
Observe que los constructores, salvo en casos excepcionales, deben declararse siempre públicos
El operador new crea un nuevo objeto, en este caso de la clase CCuenta, y a continuación se
invoca al constructor de su clase para realizar las operaciones de iniciación que estén programadas.
Cuando en una clase un mismo método se define varias veces con distinto número de
parámetros, o bien con el mismo número de parámetros pero diferenciándose una definición de
otra en que al menos un parámetro es de un tipo diferente, se dice que el método está
sobrecargado.
Los métodos sobrecargados pueden diferir también en el tipo del valor retornado. Ahora bien, el
compilador C# no admite que se declaren dos métodos que sólo difieran en el tipo del valor
retornado; deben diferir también en la lista de parámetros; esto es, lo que importa son el número y
Cuando una clase sobrecarga un método una o más veces, ¿cómo sabe C# cuál tiene que
ejecutar cuando se invoque? Pues esto lo hace comparando el número y los tipos de los argumentos
especificados en la llamada con los parámetros especificados en las distintas definiciones del
método.
1.9. Herencia
La herencia es una de las características más importantes en la P00 porque permite que una
clase herede los atributos y métodos de otra clase (los constructores no se heredan). Esta
Con la herencia todas las clases están clasificadas en una jerarquía estricta. Cada clase tiene su
superclase (la clase superior en la jerarquía, también llamada clase base), y cada clase puede tener
una o más subclases (las clases inferiores en la jerarquía; también llamadas clases derivadas).
Las clases que están en la parte inferior en la jerarquía se dice que heredan de las clases que
El término heredar significa que las subclases disponen de todos los atributos, propiedades y
métodos de su superclase. Este mecanismo proporciona una forma rápida y cómoda de extender la
funcionalidad de una clase. En C# cada clase sólo puede tener una superclase (o clase base), lo que
espacio de nombres System. Por lo tanto, cualquier clase que implementemos en nuestras
Como ejemplo podríamos añadir una nueva clase denominada CCuentaAhorro que sea subclase
de CCuenta:
CCuentaAhorro hereda todos los atributos, propiedades y métodos de CCuenta, excepto los
cuenta01.TipoDeInteres = 2.5;
cuenta01.ingreso(12000);
cuenta01.reintegro(3000);
System.Console.WriteLine(cuenta01.Nombre);
System.Console.WriteLine(cuenta01.Cuenta);
System.Console.WriteLine(cuenta01.Saldo);
System.Console.WriteLine(cuenta01.TipoDeInteres);
tendremos que añadir a esta clase un constructor con los parámetros necesarios. Si además
queremos ampliar la funcionalidad de la clase con nuevos atributos y métodos, también podemos
CuotaMantenimiento = mant;
Ilustración 4 La
subclase
CCuentaAhorro
Una subclase puede redefinir cualquier método heredado de su clase padre, siempre que sea
significa volverlo a escribir en la subclase con el mismo nombre, la misma lista de parámetros y el
mismo tipo del valor retornado que tenía en la superclase (incluiríamos la palabra new para
especificar que esta nueva versión reemplaza a la heredada); su cuerpo será adaptado a las
necesidades de la subclase.
Por ejemplo, supongamos que queremos obligar a disponer de un saldo positivo superior a 1500
para las cuentas de ahorro con un interés igual o mayor de 3,5; esto supone redefinir el método
reintegro así:
continuación:
Clase CCuenta
Atributos Propiedades/Métodos
cuenta Nombre
saldo Cuenta
tipoDeInteres Saldo
ingreso
reintegro
TipoDeInteres
Clase CCuentaAhorro
Atributos Propiedades/Métodos
cuenta Nombre
saldo Cuenta
tipoDeInteres Saldo
cuotaMantenimiento ingreso
reintegro
TipoDeInteres
constructores CCuentaAhorro
Observe que los constructores de la clase CCuenta no se heredan, puesto que cada clase define
el suyo por omisión, y que el método reintegro queda oculto por el método del mismo nombre de la
clase CCuentaAhorro.
Para iniciar los atributos heredados de la clase base, lo más sencillo es invocar al constructor de
la misma: esto se hace mediante la palabra reservada base seguida de los argumentos
cabecera del constructor de la subclase separada por dos puntos (vea la Ilustración 4).
Una subclase no tiene acceso directo a los miembros privados de su superclase, sino que el
C# utiliza de forma implícita la palabra reservada this para almacenar en todo instante una
referencia al objeto que invoca al método, por lo que también es correcto escribir:
2. El Lenguaje C#
2.1. Introducción
C# es el último en una línea de evolución de los lenguajes derivados de C, que incluye C++ y Java.
Es usado por Microsoft para desarrollar la mayoría del código de .NET. Por tanto, es el lenguaje ideal
para el desarrollo en .NET. C# introduce varias mejoras sobre C++ en las áreas de seguridad de datos,
versionamiento, eventos y recolección de basura. C# provee acceso al SO, COM y APIs y soporta el
modo unsafe que permite el uso de punteros como en C. Es más simple que C++ pero tan poderoso
delegados
programa)
System.Console.WriteLine(...);
o relativo:
using System;
Console.WriteLine(...);
Ejemplo:
En C#, los comentarios de una sola línea se crean con // y los comentarios de varias líneas inician
El CTS es el sistema común de tipos compartido por todos los lenguajes de .NET y admite tanto
Cualquier tipo puede ser tratado como un objeto ya que todos los tipos de datos en C# derivan
2.4. Identificadores
Se usan para dar nombres a los elementos de un programa como variables, constantes y
métodos.
Palabras reservadas:
Si se quiere usar un identificador que es una palabra reservada hay que usar como prefijo el
carácter ‘@’:
2.5. Variables
A continuación, se muestra una comparación entre las variables de tipo valor y las de tipo
referencia:
Como las sentencias de escape comienzan con ‘\’, para escribir este carácter hay que doblarlo, o
usar ‘@’:
string s3 = "c:\\WINNT";
string s4 = @"C:\WINNT";
Ejemplo:
Si una variable es static, existe durante toda la ejecución del programa. Sólo existe una sola
copia de la misma sin necesidad de crear objeto alguno. Hay que referirse a ella usando el nombre
completo del tipo al que pertenece. No se ve afectada su visibilidad. Ejemplo:
Una constante no puede modificar su valor durante todo el programa, para crearlas utilizamos la
palabra const:
En C#, también es posible crear tipos definidos por el usuario. Un ejemplo son los tipos
enumerados y se crean con la palabra enum:
Console.WriteLine(“{0}”, colorPaletta);
Otro tipo definido por el usuario son las estructuras y se crean con la palabra struct:
• Definición:
struct Empleado {
• Uso:
empresaEmpleado.Nombre = "Juan";
empresaEmpleado.edad = 23;
Operadores Aritméticos
+ Suma unaria, +a
- Resta unaria, -a
++ Incremento, ++a o a++
-- Decremento, --a o a--
+ Suma, a+b
- Resta, a-b
* Multiplicación, a*b
/ División, a/b
% Resto, a%b
Operadores relacionales
== Igualdad, a==b
!= Desigualdad, a!=b
< Menor que, a<b
<= Menor o igual, a<=b
> Mayor que, a>b
>= Mayor o igual, a>=b
! Negación, !a
& And binario, a&b
| Or binario, a | b
^ Or exclusivo, a^b
~ Negación binaria, ~a
&& And lógico, a&&b
|| Or lógico, a||b
Operadores de manipulación de bits
Elaborado por: MSc. Álvaro R. Altamirano Osorio
31
Programación Orientada a Objetos
int i1 = 32;
int i2 = i1 << 2; // i2 == 128
int i3 = i1 << 3; // i3 == 4
Otros operadores:
Todos los operadores binarios, salvo los de asignación, son asociativos por la izquierda.
2.7. Arrays
ejemplo: string[] a;
El tipo de datos viene dado por string[], el nombre del array es una referencia al array
3. Bibliografía
• Ceballos, F.J. (2011). Microsoft C#, Curso de Programación, 2ª. Edición. Madrid, España.
Editorial RA-MA.
• Píldoras informáticas (8 de Junio del 2018). Curso C#. Presentación. Vídeo 1. URL:
https://www.youtube.com/watch?v=6EBNIgkrU74&list=PLU8oAlHdN5BmpIQGDSHo5e1r4ZY
WQ8m4B