Está en la página 1de 108

ALGORITMOS Y

PROGRAMACIÓN
Clase 3
Clases de objetos

Dr. Lic. Waldo Hasperué


Temario
• Colecciones

• Espacios de nombres

• Clases

• Propiedades

• Métodos

• Constructores

• Instanciación
Colecciones
• Si bien el manejo de arreglos en C# permite resolver un
sinfín de problemas, muchas veces resulta interesante
manejar un array que creciera dinámicamente, o también,
disponer de un array a cuyos valores pudiéramos acceder
a través de claves, y no por el número de índice.
• Estas funcionalidades y algunas más, se encuentran
disponibles en un tipo especial de array denominado
colección (collection).
• Una colección es un objeto que internamente gestiona un
array, pero que está preparado para manejarlo de una
manera especial; podríamos definirla como un array
especializado en ciertas tareas.
Colecciones
• .NET tiene decenas de tipos de colecciones donde cada
una aporta algún manejo especial para ciertos problemas.

• La única colección que usaremos en este curso es el


ArrayList

• El ArrayList es una colección cuyo array interno se


redimensiona dinámicamente.
ArrayList
• Para poder usar un ArrayList primero hay que instanciarlo
(como a los arreglos)

ArrayList al1 = new ArrayList();

ArrayList al2 = new ArrayList(5);

string [ ] elems = new string [ ] { 'a', 'b', 'c', 'd' }


ArrayList al1 = new ArrayList(elems);
ArrayList
• Para poder usar un ArrayList primero hay que instanciarlo
(como a los arreglos)

Crea un ArrayList
ArrayList al1 = new ArrayList(); vacío.

ArrayList al2 = new ArrayList(5);

string [ ] elems = new string [ ] { 'a', 'b', 'c', 'd' }


ArrayList al1 = new ArrayList(elems);
ArrayList
• Para poder usar un ArrayList primero hay que instanciarlo
(como a los arreglos) Crea un ArrayList preparado
para almacenar 5 elementos.
Útil para optimización del uso
ArrayList al1 = new ArrayList(); de la memoria.
El ArrayList se crea vacío.

ArrayList al2 = new ArrayList(5);

string [ ] elems = new string [ ] { 'a', 'b', 'c', 'd' }


ArrayList al1 = new ArrayList(elems);
ArrayList
• Para poder usar un ArrayList primero hay que instanciarlo
(como a los arreglos)

ArrayList al1 = new ArrayList();

ArrayList al2 = new ArrayList(5);

string [ ] elems = new string [ ] { 'a', 'b', 'c', 'd' }


ArrayList al1 = new ArrayList(elems);
Crea un ArrayList con los elementos que
contiene el arreglo.
Los elementos pueden ser de cualquier
tipo.
ArrayList
• Los ArrayList permiten realizar muchas operaciones
sobre ellos.
• Add(Valor). Añade el valor representado por Valor (de cualquier
tipo).
• AddRange(Colección). Añade un conjunto de valores. Colección
puede ser tanto un arreglo como otro ArrayList u otra colección.
• Insert(Posición, Valor). Inserta el valor Valor en una posición
determinada desplazando el resto de valores dentro del propio
ArrayList.
• InsertRange(Posición, Colección). Inserta un conjunto de valores a
partir de una posición determinada.
• SetRange(Posición, Colección). Sobrescribe elementos en un
array con los valores de la colección Colección, comenzando en la
posición Posición.
ArrayList
• Ejemplo

ArrayList a = new ArrayList();


double d = 4.67;
a.Add(d);

int [ ] i = new int [ ] {1,2,3,4,5,6,7};


a.AddRange(i);

a.Insert(4, "Hola");
ArrayList
• Los elementos de los ArrayList pueden ser recorridos con
las estructuras de control for y foreach

ArrayList a = new ArrayList(new int[] {1,2,3,4,5,6});

for(int x=0; x < a.Count; x++)


Console.WriteLine(a[x]);

foreach(int o in a)
Console.WriteLine(o);
ArrayList
• Los elementos de los ArrayList pueden ser recorridos con
las estructuras de control for y foreach

Count da la cantidad
ArrayList a = new ArrayList(new int[] de
{1,2,3,4,5,6});
elementos que
tiene un ArrayList

for(int x=0; x < a.Count; x++)


Console.WriteLine(a[x]);

foreach(int o in a)
Console.WriteLine(o);
ArrayList
• Los elementos de los ArrayList pueden ser recorridos con
las estructuras de control for y foreach
Los elementos se
acceden mediante el
ArrayList a = new ArrayList(new int[]uso de corchetes.
{1,2,3,4,5,6});
El primer elemento es
el de la posición cero.
for(int x=0; x < a.Count; x++)
Console.WriteLine(a[x]);

foreach(int o in a)
Console.WriteLine(o);
ArrayList
• Los elementos de los ArrayList pueden ser recorridos con
las estructuras de control for y foreach

ArrayList a = new ArrayList(new int[] {1,2,3,4,5,6});

for(int x=0; x < a.Count; x++)


Console.WriteLine(a[x]);
Debería ser el
foreach(int o in a) mismo tipo que los
elementos del
Console.WriteLine(o); ArrayList
ArrayList
• Los elementos de los ArrayList pueden ser de cualquier
tipo por lo tanto al poder ser usados deben ser casteados
al tipo correspondiente.

ArrayList a = new ArrayList(new int[] {1, 2.34, "5"});

int i = (int) a[0];


double d = (double) a[1];
string s = ((string) a[2]) + " peras";
ArrayList
• Los elementos de los ArrayList pueden de cualquier tipo
por lo tanto al poder ser usados deben ser casteados al
tipo correspondiente.

ArrayList a = new ArrayList(new int[] {1, 2.34, "5"});

int i = (int) a[0];


double d = (double) a[1]; Obviamente
Obviamente hayhay
que
saber
queque
saber
tipoque
de
string s = ((string) a[2]) + " peras"; datos
tipo
sehay
encuentra
en cadaen
cadaposición
posicióndel
del
ArrayList
ArrayList
ArrayList
• Para poder hacer uso de los ArrayList se debe incluir un
espacio de nombres (namespace) llamado System.Collections

using System; Esta cláusula nos permite


using System.Collections; utilizar todos los tipos de
colecciones disponibles,
namespace Ejercicio1
entre ellos el ArrayList
{
class Program
{
public static void Main(string[] args)
{
ArrayList a = new ArrayList();
}
}
}
Espacios de nombres
• .NET está organizado en espacios de nombres
(namespace) y clases.

• Un espacio de nombres puede definir: clases, espacios


de nombres, delegados, eventos, tipos enumerativos, etc.

• System es un espacio de nombres y entre sus clases


podemos encontrar Console, DateTime, Math, Random, .

• System.Collections es un espacio de nombres y entre sus


clases están ArrayList, BitArray, Hashtable, SortedList
Espacios de nombres
• Para hacer uso de un espacio de nombres se utiliza la
palabra clave using.
using System;
using System.Collections;

• El uso de esta "inclusión" es opcional, si no se agrega la


cláusula using correspondiente, en el código puede
utilizar el nombre completo.
System.Console.WriteLine("Hola Mundo!");
System.Collections.ArrayList a;
Espacios de nombres

• Pueden declararse espacios de nombres propios para


ayudar a controlar el ámbito de clase y nombres de
método en proyectos de programación grandes.

• Para ello se utiliza la palabra clave namespace.


Espacios de nombres

namespace Ejemplo
{
class ClaseEjemplo
{
public static void MetodoEjemplo()
{

Dentro del bloque del namespace se


} definen todas las clases que se deseen
}
}
Agregando un nuevo archivo al proyecto

Click derecho sobre el


proyecto y elegir opción Add
 New Item…
Agregando un nuevo archivo al proyecto

En
En el
el item
item C#
C#
seleccionar
seleccionar Class
Class
Agregando un nuevo archivo al proyecto

Darle un nombre al nuevo


archivo y presionar Create
EnEnC#ellos
item C#
archivos de código
seleccionar Class
llevan extensión .cs
Agregando un nuevo archivo al proyecto

El archivo es
agregado al árbol
del proyecto
Agregando un nuevo archivo al proyecto

Por defecto el
archivo es creado
dentro del mismo
namespace del
propio proyecto
Creando una función dentro de la clase
namespace Ejercicio1
{ Este código es
/// <summary> agregado
/// Description of MiPrimerClase. automáticamente al
/// </summary> crear una clase.
public class MiPrimerClase Más adelante veremos
{ para que se usa
public MiPrimerClase()
{
}
public static void Saludar()
{
Console.WriteLine("Perfecto funcionó");
}
}
}
MiPrimerClase.cs
Creando una función dentro de la clase
namespace Ejercicio1
{
/// <summary>
/// Description of MiPrimerClase.
/// </summary>
public class MiPrimerClase Agregar esta
{ función
public MiPrimerClase()
{
}
public static void Saludar()
{
Console.WriteLine("Perfecto, funcionó");
}
}
}
MiPrimerClase.cs
Usando la nueva clase
• Modificar el archivo Program.cs

namespace Ejercicio1
{
class Program
{
public static void Main(string[] args)
{
MiPrimerClase.Saludar();

Console.ReadKey(true);
}
}
}

Program.cs
Usando la nueva clase
• Modificar el archivo Program.cs

namespace Ejercicio1
{
class Program
{
public static void Main(string[] args)
{
MiPrimerClase.Saludar();
¿Compila?
Console.ReadKey(true); ¿Ejecuta?
} ¿Por qué?
}
}

Program.cs
Entendiendo el uso de namespace
• A pesar de que el programa principal (Program.cs) y la
clase creada (MiPrimerClase.cs) están en archivos
distintos, ambas están declaradas en un mismo
namespace (Ejercicio1)
• .NET asocia todos los archivos que estén declarados en
un mismo namespace como si fuera un único archivo.
• Es como si creáramos un único archivo con todo nuestro
código.
• El uso del mismo namespace permite crear tantos
archivos como se deseen permitiendo así una mejor
organización del código
Usando otro namespace
namespace MiPropioNamespace
{
/// <summary>
/// Description of MiPrimerClase.
/// </summary>
Cambiar el nombre
public class MiPrimerClase
{ del namespace
public MiPrimerClase()
{
}
public static void Saludar()
{
Console.WriteLine("Perfecto funcionó");
}
}
}
MiPrimerClase.cs
Usando la clase creada
namespace Ejercicio1
{
class Program
{
public static void Main(string[] args)
{
MiPrimerClase.Saludar(); ¿Y ahora?

¿Compila?
Console.ReadKey(true); ¿Ejecuta?
} ¿Por qué?
}
}
Program.cs
Usando la clase creada
namespace Ejercicio1
{ El namespace
El namespace
Ejercicio1 no
class Program Ejercicio1 no tiene
tiene definida
definida una clase
{ una clase
llamada
public static void Main(string[] args) llamada
MiPrimerClase
MiPrimerClase
{
MiPrimerClase.Saludar();

Console.ReadKey(true);
}
}
}
Program.cs
Usando la clase creada
namespace Ejercicio1
{
class Program
{
public static void Main(string[] args)
{
MiPrimerClase.Saludar();

Console.ReadKey(true); ¿Cómo se
} soluciona?
}
}
Program.cs
Usando la clase creada
namespace Ejercicio1
{
class Program
{
public static void Main(string[] args)
{
MiPropioNamespace.MiPrimerClase.Saludar();

Console.ReadKey(true); Alternativa 1.
}
Especificar el
} namespace
} correspondiente

Program.cs
Usando la clase creada
using System;
using MiPropioNamespace;
Alternativa 2.

namespace Ejercicio1 Agregando el


{ namespace con
class Program la cláusula using
{
public static void Main(string[] args)
Notar que ya no
{
es necesario
MiPrimerClase.Saludar(); especificar a
que namespace
Console.ReadKey(true); corresponde
} MiPrimerClase
}
}
Program.cs
Base Classes Library (BCL)
• .NET Framework ofrece infinidad de funcionalidades
básicas y avanzadas en forma de bibliotecas de clases
constituyendo la Base Classes Library

• La BCL forma parte integral de la plataforma .NET, por lo


tanto no se trata de añadidos que se deban obtener o
adquirir aparte.

• Existen miles de clases en la BCL que se organizan de un


modo coherente en espacios de nombres (namespaces)
• Algunos incluso contienen otros espacios de nombres más
especializados
Algunos namespaces de la BCL
Clases
• Como vimos hasta ahora la BCL es un repositorio de
clases y toda la funcionalidad que nos provee .NET está
implementadas en clases.

• En .NET no existe el concepto de script o código suelto


como en otros lenguajes.

• Todo código ejecutable tiene que pertenecer a una


función dentro de una clase.
Todo el código ejecutable tiene que
Clases estar dentro de funciones
pertenecientes a alguna clase.

Program.cs MisClases.cs
using System; namespace MiPropioNamespace
using MiPropioNamespace; {
public class MiPrimerClase
namespace Ejercicio1 {
{ public MiPrimerClase() { … }
class Program
{
public static void Main(string[] args) public static void Saludar() { … }
{

} public static void Despedir() { … }

public static void HaceAlgo() }


{
… public class MiSegundaClase
} {
public MiSegundaClase() { … }
public static void NoHaceNada()
{
…. public static void Funcion1() { … }
}
}
} public static void Funcion2() { … }
}
}
Clases
• Por defecto los proyectos utilizan la función Main de la clase
Program como punto de entrada para la ejecución de cualquier
programa.
• Es posible indicarle al compilador otro punto de entrada, pero
no usaremos esta característica.

namespace Ejercicio1
{
class Program
{
public static void Main(string[] args)
{
// Punto de entrada de cualquier programa
}
}
}
Clases
• ¿ Qué es exactamente una clase ?

• ¿ Por qué .NET está organizado en clases ?

• La clase es el componente fundamental dentro del


paradigma de programación orientado a objetos (POO).

• .NET es un framework que fomenta el paradigma de la


POO.

• Todas las aplicaciones implementadas en .NET deben ser


diseñadas dentro de este paradigma.
Programación Orientada a Objetos
• Es un paradigma de programación.

• Propone resolver problemas identificando objetos y

estableciendo relaciones de colaboración entre ellos.

• La clase, el objeto y el mensaje son sus elementos

fundamentales.
Programación Orientada a Objetos

Programación Programación Orientada


estructurada a Objetos
Objeto 1 Objeto 2
Programa
Métodos
Métodos
Datos
Datos
Módulo 1 Módulo 2
Módulo 2
Objeto 3
Métodos
Módulo 2.1 Módulo 2.2 Datos
Ventajas de la Programación Orientada a Objetos

• Reusabilidad del código mediante herencia y


encapsulamiento

• Fácil entendimiento de la lógica del programa

• Facilidad en el mantenimiento y expansión

• Fácil documentación y diseño del programa


¿Qué es un objeto?
• Uno puede mirar a su alrededor y ver muchos objetos del
mundo real: un perro, un escritorio, un televisor, una
bicicleta etc.

• Cada uno de los objetos comparten dos características:


• Estado
• Comportamiento

• Los sustantivos son un buen punto de partida para


determinar los objetos de un sistema.
¿Qué es una clase?
 Las clases son declaraciones de objetos. Esto quiere
decir que la definición de un objeto es la Clase.

 Clasificación en base a comportamiento y atributos


comunes.
¿Qué es una clase?
 Una clase es una construcción estática que describe un
comportamiento común y atributos que toman distintos
estados.

 Su formalización es a través de una estructura de datos


que incluye datos y funciones, llamadas métodos. Los
métodos son los que definen el comportamiento.
Clase - Ejemplo
 ¿Cuál es el estado y el comportamiento que tienen en
común todos los autos?

Modelo Acelerar
Marca Desacelerar
Color Apagar
Velocidad Arrancar
Clase de objetos
nombre Auto

marca
modelo
Atributos color
(datos) velocidad
capacidad baúl
acelerar()
desacelerar()
arrancar()
apagar()
Comportamiento
(métodos) Todos los métodos
necesarios para ver y
modificar c/ característica
¿Qué es un objeto?
 Es instancia de una clase.
 Todas las instancias de una misma clase tienen los
mismos estados y el mismo comportamiento.
 Cada instancia tiene sus propios valores para cada
estado
Clases en C#
• Sintaxis de definición de clases

class <nombreClase>
{
<miembros>
}

• Los miembros de una clase son los datos y métodos de


los que van a disponer todos los objetos de la misma
Clases en C#

Ejemplo de definición de una clase:

class Auto {
}

• Esta definición de la clase Auto compila y ejecuta.


• Obviamente estamos declarando una clase sin estado
ni comportamiento y no resulta para nada útil.
Instanciando objetos
• Para poder usar objetos hay que instanciar una clase.

• Para crear una instancia se utiliza el operador new y se


debe especificar la clase del objeto a crear,
por ejemplo: new Auto().

• Se pueden crear tantas instancias de una clase como se


necesite.
Clases en C#
namespace Ejercicio1
{
class Program
{
public static void Main(string[] args)
{
Auto a1;
a1 = new Auto();

Console.ReadKey(true);
}
}

class Auto Recordar que cada clase debe


{ tener su propio bloque de código
} encerrado entre corchetes
}
Clases en C#
namespace Ejercicio1
{
class Program
{
public static void Main(string[] args)
{
Auto a1;
a1 = new Auto(); Declaración de
una variable de
Console.ReadKey(true); tipo Auto
}
}

class Auto
{
}
}
Clases en C#
namespace Ejercicio1
{
class Program
{
public static void Main(string[] args)
{
Auto a1; Creación de una
a1 = new Auto(); instancia de la
clase Auto
Console.ReadKey(true); almacenada en la
} variable a1
}

class Auto
{
}
}
Clases en C# - Campos
• Campos: es un dato común a todos las instancias de
una determinada clase.

• Se definen dentro de la clase con la siguiente sintaxis:

<tipoCampo> <nombreCampo>;
Clases en C# - Campos
• Ejemplo definición de clase Auto con dos campos
(marca y modelo)

• Dentro del paradigma de POO se los conocen con el


nombre de variable de instancia.

class Auto
{
public string marca; Por ahora cada vez que
declaremos un campo
public int modelo; le agregaremos el
} modificador public.
Ya veremos que
significa.
Clases en C# - Campos
Para acceder a un campo de un determinado
objeto se usa la sintaxis:

<objeto>.<campo>

Por ejemplo, para acceder al campo modelo de


un objeto Auto llamado A y cambiar su valor
por 2001 se haría:

A.modelo = 2001;
Clases en C# - Campos
public static void Main(string[] args)
{
Auto a1;
a1 = new Auto();
a1.marca = "Fiat";
a1.modelo = 2000;
Auto a2;
a2 = new Auto();
a2.marca = "Ford";
a2.modelo = 2001;
Console.WriteLine("Marca " + a1.marca + " modelo " + a1.modelo);
Console.WriteLine("Marca " + a2.marca + " modelo " + a2.modelo);
}
Clases en C# - Métodos
• A las funciones que se implementan en una clase de objetos se las
llaman métodos.

• Dentro de los métodos puede accederse a todos los campos de la


clase.

• Los métodos permiten manipular los datos almacenados en los


objetos.

• La sintaxis que se usa en C# para definir los métodos es la siguiente:

<tipoDevuelto> <nombreMétodo> (<parametros>)


{
<instrucciones>
}
Clases en C# - Métodos
• Ejemplo: Definiendo el método imprimir() en la clase Auto,
se evitaría tener que acceder a sus variables de instancia desde
el código fuera de la clase.

class Auto {
public string marca;
public int modelo;
public void imprimir(){
Console.WriteLine("Marca " + marca + " modelo " + modelo);
}
}

Por ahora cada vez que declaremos un


campo le agregaremos el modificador
public.
Ya veremos que significa.
Clases en C# - Métodos
• Reemplazamos las instrucciones que imprimen.

public static void Main(string[] args)


{
Auto a1;
a1 = new Auto();
a1.marca = "Fiat";
a1.modelo = 2000;
Auto a2;
a2 = new Auto();
a2.marca = "Ford";
a2.modelo = 2001;
a1.imprimir();
a2.imprimir();
}
Sobrecarga de Métodos
 Una clase puede tener más de un método con el
mismo nombre siempre que sus firmas sean
diferentes.

 La firma de un método consiste en:


 El nombre
 El número de parámetros
 El tipo y el orden de los parámetros
 Los modificadores de los parámetros

 El tipo de retorno no es parte de la firma.


 Los nombres de los parámetros tampoco son parte
de la firma.
Clases en C# - Sobrecarga de Métodos
• Agreguemos un nuevo método "acelerar" con tres
sobrecargas

public double velocidad = 0;


public double acelerar() {
return velocidad+= 10;
}
public double acelerar(int valor) {
return velocidad+= valor;
}
public double acelerar(double coeficiente) {
return velocidad*= coeficiente;
}
Clases en C# - Sobrecarga de Métodos
public static void Main(string[] args)
{
Auto a1 = new Auto();

Console.WriteLine(a1.acelerar());
Console.WriteLine(a1.acelerar(25));
Console.WriteLine(a1.acelerar(1.1));
}
Clases en C# - Constructores
public static void Main(string[] args)
{
Auto a1;
a1 = new Auto(); En este ejemplo
a1.marca = "Fiat"; luego de
a1.modelo = 2000; instanciar la
Auto a2; clase Auto se
a2 = new Auto(); asignan valores a
a2.marca = "Ford"; sus campos
a2.modelo = 2001;
a1.imprimir();
a2.imprimir();
}
Clases en C# - Constructores
• Pero nada impide que se haga lo siguiente:
Auto a = new Auto();
a.imprimir(); //  ¿qué imprime?

• Una estrategia muy utilizada para asignar campos de


un objeto es hacerlo en el momento de su creación a
través del pasaje de parámetros.

• Un constructor definido en una clase es un método


especial que contiene código a ejecutar cada vez
que se crea una instancia de esa clase.
Clases en C# - Constructores
• La sintaxis de un constructor consiste en definirlo
como cualquier otro método pero dándole el mismo
nombre que la clase y no indicando el tipo de valor de
retorno.

<modificadores> <nombreClase>(<parámetros>)
{
<código>
}
Clases en C# - Constructores
• Redefinimos la clase Auto definiendo un constructor adecuado para poder
asignar valor a las variables de instancia en el momento de crear el objeto.
class Auto {
public string marca;
public int modelo;
public void imprimir(){
Console.WriteLine("Marca y modelo: {0} {1}", marca, modelo);
}
public Auto(string marca, int modelo) {
this.marca = marca;
this.modelo = modelo;
}
}
Clases en C# - Constructores
• Redefinimos la clase Auto definiendo un constructor adecuado para poder
asignar valor a las variables de instancia en el momento de crear el objeto.
class Auto {
public string marca;
public int modelo;
public void imprimir(){
Console.WriteLine("Marca y modelo: {0} {1}", marca, modelo);
}
public Auto(string marca, int modelo) { En el constructor utilizamos
this.marca = marca; this.marca para
referirnos a la variable de
this.modelo = modelo;
instancia marca, y
} simplemente marca para
} referirnos al parámetro del
método.
Clases en C# - Constructores
• Ahora se reescribe el método Main de la siguiente
forma:

public static void Main(string[] args)


{
Auto a1 = new Auto("Fiat", 2000);
Auto a2 = new Auto("Ford", 2001);
a1.imprimir();
a2.imprimir();

Console.ReadKey(true);
}
Clases en C# - Constructores

public static void Main(string[] args)


{
Auto a1 = new Auto("Fiat", 2000);
Auto a2 = new Auto("Ford", 2001);
Auto a3 = new Auto();
a1.imprimir();
a2.imprimir(); Agregue esta línea
¿Qué sucede?

Console.ReadKey(true);
}
Clases en C# - Constructores
Constructor por defecto
En caso de no definir un constructor para la clase el compilador
creará uno por defecto:

<nombreClase>()
{
}

Si definimos un constructor, el compilador no incluye ningún otro


constructor. Por ello C=new Auto(); da error de compilación pues
el constructor por defecto no existe más.
Clases en C# - Constructores
• Al igual que los métodos, los constructores permiten
sobrecarga.

• Se puede definir más de un constructor, siempre que


sus firmas sean diferentes.
Clases en C# - Constructores
class Auto
{
public string marca; Constructor que no recibe
public int modelo; parámetros
public Auto(){
}
public Auto(string marca, int modelo){
this.marca = marca;
this.modelo = modelo;
}
public Auto(string marca, string modelo){
this.marca = marca;
this.modelo = Int64.Parse(modelo);
}
public void imprimir(){
Console.WriteLine("Marca " + marca + " modelo " + modelo);
}
}
Clases en C# - Constructores
class Auto
{
public string marca; Constructor que recibe un
public int modelo; string y un int
public Auto(){
}
public Auto(string marca, int modelo){
this.marca = marca;
this.modelo = modelo;
}
public Auto(string marca, string modelo){
this.marca = marca;
this.modelo = Int64.Parse(modelo);
}
public void imprimir(){
Console.WriteLine("Marca " + marca + " modelo " + modelo);
}
}
Clases en C# - Constructores
class Auto
{
public string marca; Constructor que recibe dos
public int modelo; strings
public Auto(){
}
public Auto(string marca, int modelo){
this.marca = marca;
this.modelo = modelo;
}
public Auto(string marca, string modelo){
this.marca = marca;
this.modelo = Int64.Parse(modelo);
}
public void imprimir(){
Console.WriteLine("Marca " + marca + " modelo " + modelo);
}
}
Clases en C# - Constructores
• Ahora es posible hacer uso de los tres constructores

Auto a1 = new Auto();

Auto a2 = new Auto("Fiat", 2000);

Auto a3 = new Auto("Ford", "2010");


Miembros
• ¿Notaron que no estuvimos usando la palabra reservada
static cada vez que definíamos un método?
class Auto
{
public string marca;
public int modelo;
public Auto(string marca, int modelo){
this.marca = marca;
this.modelo = modelo;
}
public Auto(string marca, string modelo){
this.marca = marca;
this.modelo = Int64.Parse(modelo);
}
public void imprimir(){
Console.WriteLine("Marca " + marca + " modelo " + modelo);
}
}
Miembros
• En POO hay dos tipos de miembros (variables y
métodos)
• De instancia
• De clase

• En C# si queremos declaran miembros de clase usamos


la palabra reservada static.
public static void UnMetodoDeClase() { }

• Si queremos que los miembros sean de instancia no


ponemos nada
public void UnMetodoDeInstancia() { }
Miembros de instancia
• Los miembros de instancia, ya sean variables o métodos
son utilizados cuando se trabaja con instancias

Auto a1 = new Auto("Ford", 1987);


Auto a2 = new Auto("Peugeot", 1995);
Auto a3 = new Auto("Fiat", 2008);

Console.WriteLine(a1.marca);
Console.WriteLine(a2.marca);
Console.WriteLine(a2.marca);
Miembros de instancia
• Los miembros de instancia, ya sean variables o métodos
son utilizados cuando se trabaja con instancias

Auto a1 = new Auto("Ford", 1987);


Auto a2 = new Auto("Peugeot", 1995);
Auto a3 = new Auto("Fiat", 2008);
Si vemos con cuidado
la clase Auto define
Console.WriteLine(a1.marca); una única variable
Console.WriteLine(a2.marca); marca.
Entonces ¿Por qué es
Console.WriteLine(a2.marca); capaz de almacenar
tres valores?
Miembros de instancia
• Cuando se instancia una clase, el compilador genera en
memoria una "copia" de la clase para cada instancia
creada.
RAM

a1 a2 a3

marca = "Ford" marca = "Peugeot" marca = "Fiat"


modelo = 1987 modelo = 1995 modelo = 2008

Técnicamente hay tres variables marca y tres variables modelo


Miembros de instancia
• Los métodos de instancia son los que acceden a cada
variable dependiendo de quien sea el objeto receptor del
mensaje.
RAM

a1 a2 a3

marca = "Ford" marca = "Peugeot" marca = "Fiat"


modelo = 1987 modelo = 1995 modelo = 2008

a1.imprimir();

El método imprimir usará las variables de a1


Miembros de instancia
• Los métodos de instancia son los que acceden a cada
variable dependiendo de quien sea el objeto receptor del
mensaje.
RAM

a1 a2 a3

marca = "Ford" marca = "Peugeot" marca = "Fiat"


modelo = 1987 modelo = 1995 modelo = 2008

a2.imprimir();

El método imprimir usará las variables de a2


Miembros de instancia
• Los métodos de instancia son los que acceden a cada
variable dependiendo de quien sea el objeto receptor del
mensaje.
RAM

a1 a2 a3

marca = "Ford" marca = "Peugeot" marca = "Fiat"


modelo = 1987 modelo = 1995 modelo = 2008

a3.imprimir();

El método imprimir usará las variables de a3


Miembros de clase
• Agreguemos una variable de clase a la clase Auto

class Auto
{ Declaración de
public string marca;
una variable de
public int modelo;
public static int impresiones = 0; clase

public Auto(string marca, int modelo){


this.marca = marca;
this.modelo = modelo;
}
public void imprimir(){
Console.WriteLine("Marca y modelo: {0} {1}", marca, modelo);
impresiones++;
}
}
Miembros de clase
• Agreguemos una variable de clase a la clase Auto

class Auto
{ La variable es usada
public string marca;
public int modelo; como una variable más.
public static int impresiones = 0; En este ejemplo la
usamos para llevar la
public Auto(string marca, int modelo){ contabilidad de la
this.marca = marca; cantidad de veces que se
this.modelo = modelo; imprime un auto
}
public void imprimir(){
Console.WriteLine("Marca y modelo: {0} {1}", marca, modelo);
impresiones++;
}
}
Miembros de clase
class Program
{
public static void Main(string[] args)
{
Auto a1 = new Auto("Ford", 1987);
Auto a2 = new Auto("Peugeot", 1995);
Notar que para hacer
Auto a3 = new Auto("Fiat", 2008); referencia a una
a1.imprimir(); variable de clase se
a2.imprimir(); usa la propia clase

a3.imprimir();
Console.WriteLine(Auto.impresiones);
}
}
Miembros de clase
class Program
{
public static void Main(string[] args)
{
Auto a1 = new Auto("Ford", 1987);
Auto a2 = new Auto("Peugeot", 1995);
Auto a3 = new Auto("Fiat", 2008);
a1.imprimir(); ¿Qué imprime?
a2.imprimir();
a3.imprimir();
Console.WriteLine(Auto.impresiones);
}
}
Miembros de clase
RAM
Auto

impresiones = 3

a1 a2 a3

marca = "Ford" marca = "Peugeot" marca = "Fiat"


modelo = 1987 modelo = 1995 modelo = 2008

La variable impresiones es una variable de la clase y es común


a todas las instancias. Por eso imprime el valor 3.
Miembros de clase
• Los miembros de clase no pertenecen a ninguna
instancia en particular, pertenecen a la clase

• Se declaran con la palabra reservada static

• Todas las instancias comparten los mismos miembros de


clase

• La referencia a un miembro de clase se hace mediante el


nombre de clase
<clase> . <miembro>
Miembros
public static void Main(string[] args)
{
Auto a1 = new Auto("Ford", 1987);
Auto a2 = new Auto("Peugeot", 1995);
Auto a3 = new Auto("Fiat", 2008);
a1.imprimir();
a2.imprimir();
a3.imprimir();
Console.WriteLine(Auto.impresiones);
a1.impresiones++;
Esta sentencia produce
Auto.marca = "Renault"; error. Los miembros de
Auto.imprimir(); clase no pueden ser
} referenciados con instancias
Miembros
public static void Main(string[] args)
{
Auto a1 = new Auto("Ford", 1987);
Auto a2 = new Auto("Peugeot", 1995);
Auto a3 = new Auto("Fiat", 2008);
a1.imprimir();
a2.imprimir();
a3.imprimir();
Console.WriteLine(Auto.impresiones);
a1.impresiones++;
Auto.marca = "Renault"; marca es una variable de
Auto.imprimir(); instancia, no puede ser
referenciada por la clase.
}
Miembros
public static void Main(string[] args)
{
Auto a1 = new Auto("Ford", 1987);
Auto a2 = new Auto("Peugeot", 1995);
Auto a3 = new Auto("Fiat", 2008);
a1.imprimir();
a2.imprimir();
a3.imprimir();
Console.WriteLine(Auto.impresiones);
a1.impresiones++;
Auto.marca = "Renault"; Imprimir es un método de
Auto.imprimir(); instancia, no puede ser
referenciado por la clase.
}
Programación orientada a objetos
• ¿Recuerdan los ArrayList?

ArrayList a = new ArrayList();


double d = 4.67;
a.Add(d);

int[] i = new int[] {1,2,3,4,5,6,7};


a.AddRange(i);

a.Insert(4, "Hola");

Console.WriteLine(a.Count);
Programación orientada a objetos
• ¿Recuerdan los ArrayList?

ArrayList es una
ArrayList a = new ArrayList(); clase y por eso hay
double d = 4.67; que instanciar
a.Add(d); objetos ArrayList
antes de poder
usarlos
int[] i = new int[] {1,2,3,4,5,6,7};
a.AddRange(i);

a.Insert(4, "Hola");

Console.WriteLine(a.Count);
Programación orientada a objetos
• ¿Recuerdan los ArrayList?
Add,
Add, AddRange,
AddRange,
ArrayList a = new ArrayList(); Insert
Add,
Insert son
AddRange,
son
métodos
Insert
métodos de
de la
son métodos
la
double d = 4.67;
declase
clase ArrayList
la clase
ArrayList
ArrayList
a.Add(d); que
que definen
que definen el
definen el
el
comportamiento
comportamiento
comportamientode
int[] i = new int[] {1,2,3,4,5,6,7}; losde
de los
los objetos
objetos
objetos
ArrayList
ArrayList
ArrayList
a.AddRange(i);

a.Insert(4, "Hola");

Console.WriteLine(a.Count);
Programación orientada a objetos
• ¿Recuerdan los ArrayList?

ArrayList a = new ArrayList();


double d = 4.67; Count es parte del
a.Add(d); estado de un
ArrayList
int[] i = new int[] {1,2,3,4,5,6,7};
a.AddRange(i);

a.Insert(4, "Hola");

Console.WriteLine(a.Count);
Programación orientada a objetos
• ¿Recuerdan los String? .NET tiene una clase
String que define el
estado y el
string i = "hola mundo"; comportamiento de todas
las variables string
int a = i.IndexOf("mundo");
i = i.Insert(a-1, " mi lindo ");
i = i.Remove(a, 3);
i = i.Replace("mundo", "MunDo ");
string s = i.Substring(10, 8);
s = s.ToLower();
s = s.ToUpper();
s = s.Trim();
Programación orientada a objetos
• ¿Recuerdan los String?
¿Cuál es el
comportamiento de un
string i = "hola mundo"; string?
int a = i.IndexOf("mundo");
i = i.Insert(a-1, " mi lindo ");
i = i.Remove(a, 3);
i = i.Replace("mundo", "MunDo ");
string s = i.Substring(10, 8);
s = s.ToLower();
s = s.ToUpper();
s = s.Trim();
Programación orientada a objetos
• ¿Recuerdan los String?

La única diferencia está


string i = "hola mundo"; en la instanciación.
Por simplicidad no se usa
int a = i.IndexOf("mundo"); el comando new.
i = i.Insert(a-1, " mi lindo ");
i = i.Remove(a, 3);
i = i.Replace("mundo", "MunDo ");
string s = i.Substring(10, 8);
s = s.ToLower();
s = s.ToUpper();
s = s.Trim();
Aunque es posible hacerlo
string a = new String(new char [ ] {'H','o','l','a',' ','m','u','n','d','o'});
Programación orientada a objetos
• En .NET todos los tipos básicos son instancias de alguna clase
• Int16, Int32, Int64, Double, Boolean, Char, etc.

• Los métodos más utilizado en los tipos básicos son


• ToString()
• Parse(string);

int i = Int32.Parse("5");
double d = Double.Parse("9.1");
char c = 'Y';
string s = i.ToString() + d.ToString() + c.ToString();
Console.WriteLine(s);
Programación orientada a objetos
• ¿Recuerdan la clase Console?

string cadena = Console.ReadLine();


Console.WriteLine(cadena);
Console.ReadKey(true);

¿Qué
¿Quéson sonReadLine
ReadLine,y
WriteLine
WriteLiney en
ReadKey
la claseen
la clase
Console?
Console?
Programación orientada a objetos
• ¿Recuerdan la clase Console?

string cadena = Console.ReadLine();


Console.WriteLine(cadena);
Console.ReadKey(true);

¿Qué son ReadLine y


Métodosen
WriteLine delaclase.
clase
Console?

También podría gustarte