Está en la página 1de 8

Capítulo 4

Introducción a las
clases, objetos y
métodos
Copyright © 2010. McGraw-Hill España. All rights reserved.

Schildt, Herbert. Fundamentos de C# 3.0, McGraw-Hill España, 2010. ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3196018.
Created from unadsp on 2018-10-13 17:10:58.
120 Fundamentos de C# 3.0

Habilidades y conceptos clave


● Fundamentos de las clases
● Instanciar un objeto
● Conceptos básicos del método
● Conceptos básicos de los parámetros
● Obtener un valor de un método
● Constructores
● new
● Recolector de basura
● Destructores
● La palabra clave this

A ntes de avanzar más en el estudio de C#, necesitas obtener conocimiento sobre las clases. La
clase es la esencia de C# porque define la naturaleza de un objeto; y como tal, la clase con-
forma las bases de la programación orientada a objetos en C#. Dentro de una clase se definen los
datos y el código que actúa sobre ellos. El código está contenido en métodos. Como las clases, los
objetos y los métodos son fundamentales para C#; en este capítulo presentamos una introducción
sobre ellos. Tener un conocimiento básico de estas características te permitirá escribir programas
más sofisticados y entender mejor ciertos elementos clave de C# descritos en el capítulo 5.
Copyright © 2010. McGraw-Hill España. All rights reserved.

Fundamentos de las clases


Hemos utilizado clases desde el principio de este libro. Por supuesto, sólo se han utilizado clases
extremadamente simples, y no hemos aprovechado la mayoría de sus características. Como verás,
las clases son mucho más poderosas que los ejemplos limitados que se han presentado hasta el
momento.
Comencemos por revisar los fundamentos. Una clase es una plantilla con la que se define la
forma de un objeto. Típicamente especifica tanto el código como los datos, donde el primero actúa
sobre los segundos. C# utiliza una especificación de clase para construir objetos. Los objetos son
instancias de una clase. Así, una clase es, en esencia, un conjunto de planos que especifican cómo
construir un objeto. Es muy importante que quede clara esta cuestión: una clase es una abstracción
lógica; no es sino hasta el momento en que se crea un objeto de esa clase cuando existe una repre-
sentación física de la misma en la memoria de la computadora.
Otro punto importante: recuerda que los métodos y las variables que constituyen la clase son
llamados miembros de clase.

Schildt, Herbert. Fundamentos de C# 3.0, McGraw-Hill España, 2010. ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3196018.
Created from unadsp on 2018-10-13 17:10:58.
Capítulo 4: Introducción a las clases, objetos y métodos 121

La forma general de una clase


Cuando defines una clase, declaras los datos que contiene y el código que opera sobre ellos. Mien-
tras que una clase simple puede contener sólo código o sólo datos, la mayoría de las clases en el
mundo real contienen ambos.
En términos generales, los datos están contenidos en variables de instancia definidas por la
clase, y el código está contenido en los métodos. Es importante dejar en claro, sin embargo, que
las definiciones de C# incluyen una amplia gama de miembros de clase, entre los que se cuentan
variables de instancia, variables estáticas, constantes, métodos, constructores, destructores, indexa-
dores, eventos, operadores y propiedades. Por el momento limitaremos nuestro análisis de las cla-
ses a sus elementos esenciales: variables de instancia y métodos. Más tarde, en este mismo capítu-
lo, analizaremos los constructores y los destructores. Los demás miembros de clase son analizados
en capítulos subsecuentes.
Una clase se crea utilizando la palabra clave class. El formato general para definir una class
que contiene sólo variables de instancia y métodos es el siguiente:
class nombre-de-clase {
// Declaración de variables de instancia.
acceso tipo var1;
acceso tipo var2;
// ...
acceso tipo varN;
// Declaración de métodos.
acceso tipo-recuperado método1(parámetros) {
// cuerpo del método
}
acceso tipo-recuperado método2(parámetros) {
// cuerpo del método
Copyright © 2010. McGraw-Hill España. All rights reserved.

}
// ...
acceso tipo-recuperado métodoN(parámetros) {
// cuerpo del método
}
}
Observa que cada variable y método es antecedido por un acceso. Aquí, acceso es una espe-
cificación, como public, que indica la manera como puede ser accesado ese miembro de la clase.
Como se mencionó en el capítulo 1, los miembros de clase pueden ser exclusivos de una clase, o
bien tener más alcance. El delimitador de acceso determina el alcance permitido para la variable
o método al que se aplica. El delimitador de acceso es opcional, y en su ausencia, el exclusivo de
la clase a la que pertenece. Los miembros con acceso exclusivo (private) pueden ser utilizados
únicamente por otros miembros de la misma clase. Para los ejemplos de este capítulo, todos los
miembros de clase (excepto el método Main( )) serán especificados como public (públicos). Ello
significa que podrán ser utilizados por todo el código restante, incluso el escrito fuera de la clase
a la que pertenecen. El método Main( ) continuará utilizando el acceso por omisión porque es la

Schildt, Herbert. Fundamentos de C# 3.0, McGraw-Hill España, 2010. ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3196018.
Created from unadsp on 2018-10-13 17:10:58.
122 Fundamentos de C# 3.0

práctica actualmente recomendada. Regresaremos al tema de los delimitadores de acceso en un


capítulo posterior, cuando ya conozcas los aspectos fundamentales de las clases.
Una clase bien diseñada debe definir una y sólo una entidad lógica, aunque no existe una regla
sintáctica que obligue a hacerlo. Por ejemplo, una clase que almacena nombres y números telefó-
nicos, por lo regular no se utilizará para almacenar información sobre el mercado de acciones, el
promedio de precipitación pluvial, los ciclos de las manchas solares o cualquier otra información
sin relación lógica con los primeros. El punto aquí es que una clase bien formada agrupa informa-
ción lógicamente relacionada. Colocar información incoherente en la misma clase ¡destruirá rápi-
damente la estructura de tu código!
Hasta ahora, las clases que hemos estado utilizado tienen un solo método: Main( ). Pronto
aprenderás a utilizar otros. Sin embargo, observa que el formato general de una clase no especifica
la necesidad de un método Main( ), porque éste se requiere sólo si la clase donde aparece es el
punto de inicio de tu programa.

Definir una clase


Para ilustrar las clases desarrollaremos una que encapsule información sobre vehículos, como
automóviles, camionetas y camiones. Esta clase se llama Vehículo, y almacenará tres elementos
informativos sobre un vehículo: el número de pasajeros que puede transportar, su capacidad de
combustible y el promedio de consumo de este último (en kilómetros por litro).
La primera versión de Vehículo se muestra a continuación. Define tres variables de instancia:
Pasajeros, CapComb y Kpl. Observa que Vehículo no tiene métodos; en este momento es una
clase sólo con datos; en posteriores secciones se aumentarán los métodos.
class Vehículo {
public int Pasajeros; // cantidad de pasajeros
public int CapComb; // la capacidad de combustible en litros
public int Kpl; // consumo de combustible en kilómetros por litro
}
Copyright © 2010. McGraw-Hill España. All rights reserved.

Las variables de instancia definidas en Vehículo ilustran la manera como se declaran en gene-
ral. El formato estándar para declarar una variable de instancia es el siguiente:
acceso tipo nombre-de-variable;
Aquí, acceso especifica el alcance de la variable, tipo es el tipo de dato asignado a la variable y
nombre-de-variable es el nombre con el que será conocida en el programa. De esta manera, fuera
del delimitador de acceso, una variable de instancia se declara de la misma manera que una local.
Para Vehículo, las variables van antecedidas por el delimitador public. Como se explicó anterior-
mente, esto permite que sean accesadas por el código que se encuentra fuera de la clase Vehículo.
Una definición de clase (class) crea un nuevo tipo de dato. En este caso, el nuevo tipo de dato
recibe el nombre de Vehículo. Utilizarás este nombre para declarar objetos de tipo Vehículo. Re-
cuerda que la declaración de una clase es sólo un tipo descriptivo, no crea un objeto de hecho. Así,
el código anterior no trae a la existencia ningún objeto del tipo Vehículo.
Para crear de hecho un objeto Vehículo, utilizarás una declaración como la siguiente:
Vehículo minivan = new Vehículo(); // crea un objeto de Vehículo llamado
minivan

Schildt, Herbert. Fundamentos de C# 3.0, McGraw-Hill España, 2010. ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3196018.
Created from unadsp on 2018-10-13 17:10:58.
Capítulo 4: Introducción a las clases, objetos y métodos 123

Después de que se ejecuta esta declaración, minivan será una instancia de Vehículo. De esta manera
tendrá una existencia “física”. Por el momento, no te preocupes por los detalles de esta declaración.
Cada vez que creas una instancia de una clase, estás creando un objeto que contiene su propia
copia de cada variable de instancia definida en la clase. Así, cada objeto de Vehículo contendrá sus
propias copias de las variables Pasajeros, CapComb y Kpl. Para accesar estas variables, utilizarás
el operador de acceso a miembros de la clase, que es un punto (.); comúnmente se le conoce como
operador de punto. Este operador vincula el nombre de un objeto con el nombre de un miembro.
El formato general del operador de punto es el siguiente:
objeto.miembro
De tal manera que el objeto es especificado a la izquierda del punto y el miembro a la derecha. Por
ejemplo, para asignar el valor 72 a la variable CapComb de minivan, utiliza la siguiente declara-
ción:
minivan.CapComb = 72;

En general, puedes utilizar el operador de punto para obtener acceso tanto a variables como a mé-
todos.
He aquí el programa completo que utiliza la clase Vehículo:
/* Un programa que utiliza la clase Vehículo.
Llama a este archivo UsaVehículo.cs
*/
using System;
// Una clase que encapsula información sobre vehículos.
class Vehículo {
public int Pasajeros; // cantidad de pasajeros
public int CapComb; // la capacidad de combustible en litros
public int Kpl; // consumo de combustible en kilómetros por litro
Copyright © 2010. McGraw-Hill España. All rights reserved.

}
// Esta clase declara un objeto de tipo Vehículo.
class VehículoDemo {
static void Main() {
Crea una instancia de Vehículo
Vehículo minivan = new Vehículo();
llamada minivan.
int alcance;
// Asigna valores a los campos en minivan.
minivan.Pasajeros = 7;
Observa el uso del operador de punto para
minivan.CapComb = 72;
obtener acceso a un miembro de la clase.
minivan.Kpl = 5;
// Calcula el alcance de kilómetros por tanque lleno.
alcance = minivan.CapComb * minivan.Kpl;
Console.WriteLine("Minivan puede transportar " + minivan.Pasajeros +
" un alcance de " + alcance);
}
}

Schildt, Herbert. Fundamentos de C# 3.0, McGraw-Hill España, 2010. ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3196018.
Created from unadsp on 2018-10-13 17:10:58.
124 Fundamentos de C# 3.0

Este programa consiste de dos clases: Vehículo y VehículoDemo. Dentro de la segunda, el


método Main( ) crea una instancia de la primera llamada minivan. El código dentro de Main( )
accesa las variables de instancia asociadas con minivan, asignándoles sus respectivos valores y
utilizándolos. Es importante comprender que Vehículo y VehículoDemo son dos clases separadas.
La única relación que tienen entre sí es que una de ellas crea una instancia de la otra. Aunque se
trata de clases diferentes, el código dentro de VehículoDemo puede accesar los miembros de Ve-
hículo porque han sido declarados públicos (con la palabra clave public). Si no tuvieran el deli-
mitador public, su acceso estaría restringido a la clase Vehículo, y VehículoDemo no podría hacer
uso de ellos.
Suponiendo que le diste al archivo el nombre sugerido, UsaVehículo.cs, al compilar el pro-
grama se creará un archivo llamado UsaVehículo.exe. Ambas clases, Vehículo y VehículoDemo,
pasan a formar parte del archivo ejecutable automáticamente. El programa muestra los siguientes
datos de salida:
Minivan puede transportar 7 un alcance de 360

No es necesario que ambas clases, Vehículo y VehículoDemo, se localicen en el mismo archi-


vo de código fuente. Es posible colocar cada clase en su propio archivo, que llevarían los nombres
de Vehículo.cs y VehículoDemo.cs, por ejemplo. Sólo tienes que indicar al compilador de C# que
ambos archivos están vinculados. Por ejemplo, si dividiste el programa en dos piezas de acuerdo
con lo indicado anteriormente, podrías utilizar esta línea de comando para compilar el programa:
csc Vehículo.cs VehículoDemo.cs

Con este procedimiento se creará el archivo VehículoDemo.exe, porque ésa es la clase que con-
tiene el método Main( ). Si utilizas el IDE de Visual Studio, necesitarás añadir ambos archivos al
mismo proyecto y luego generarlo.
Antes de continuar, revisemos un principio fundamental: cada objeto tiene sus propias copias
de las variables de instancia definidas por su clase. De esta forma, el contenido de las variables
en un objeto puede ser diferente del contenido de las mismas variables en otro objeto. No hay
Copyright © 2010. McGraw-Hill España. All rights reserved.

conexión entre los dos objetos, salvo que ambos pertenecen al mismo tipo. Por ejemplo, si tienes
dos objetos Vehículo, cada uno tiene su propia copia de las variables Pasajeros, CapComb y Kpl,
pero su contenido puede ser diferente en cada uno de ellos. El siguiente programa muestra este
hecho:
// Este programa crea dos objetos Vehículo.

using System;

// Una clase que encapsula información sobre vehículos.


class Vehículo {
public int Pasajeros; // cantidad de pasajeros
public int CapComb; // la capacidad de combustible en litros
public int Kpl; // consumo de combustible en kilómetros por litro
}

// Esta clase declara dos objetos de tipo Vehículo.


class DosVehículos {

Schildt, Herbert. Fundamentos de C# 3.0, McGraw-Hill España, 2010. ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3196018.
Created from unadsp on 2018-10-13 17:10:58.
Capítulo 4: Introducción a las clases, objetos y métodos 125

static void Main() {


Vehículo minivan = new Vehículo(); Recuerda que minivan y deportivo hacen
Vehículo deportivo = new Vehículo(); referencia a dos objetos distintos.

int alcance1, alcance2;

// Asignar valores a los campos en minivan.


minivan.Pasajeros = 7;
minivan.CapComb = 72;
minivan.Kpl = 5;

// Asignar valores a los campos en deportivo.


deportivo.Pasajeros = 2;
deportivo.CapComb = 63;
deportivo.Kpl = 3;

// Calcula el alcance de kilómetros por tanque lleno.


alcance1 = minivan.CapComb * minivan.Kpl;
alcance2 = deportivo.CapComb * deportivo.Kpl;

Console.WriteLine("Minivan puede transportar " + minivan.Pasajeros +


" un alcance de " + alcance1);

Console.WriteLine("Deportivo puede transportar " + deportivo.


Pasajeros + " un alcance de " + alcance2);
}
}

Los datos de salida generados por este programa son los siguientes:
Minivan puede transportar 7 un alcance de 360
Deportivo puede transportar 2 un alcance de 189

Como puedes ver, los datos de minivan están completamente separados de los datos conteni-
Copyright © 2010. McGraw-Hill España. All rights reserved.

dos en deportivo. La figura 4-1 ilustra esta situación:

pasajeros 7
minivan capComb 72
kpl 5

pasajeros 2
deportivo capComb 63
kpl 3

Figura 4-1 Las variables de instancia de un objeto están separadas de las del otro

Schildt, Herbert. Fundamentos de C# 3.0, McGraw-Hill España, 2010. ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3196018.
Created from unadsp on 2018-10-13 17:10:58.
126 Fundamentos de C# 3.0

Cómo se crean los objetos


En los ejemplos anteriores se utilizó la siguiente línea para crear un objeto tipo Vehículo:
Vehículo minivan = new Vehículo();

Esta declaración realiza tres funciones: primero, declara una variable llamada minivan de la clase
tipo Vehículo. Esta variable no es, en sí, un objeto. En lugar de ello, es simplemente una variable
que puede hacer referencia a un objeto. Segundo, la declaración crea de hecho una instancia física
del objeto. Esto se lleva a cabo utilizando el operador new. Finalmente, asigna a minivan una re-
ferencia a ese objeto. Así, después de que se ejecuta la línea, minivan hace referencia a un objeto
de tipo Vehículo.
El operador new coloca dinámicamente (esto es, en tiempo de ejecución) el objeto en la
memoria de la computadora y regresa una referencia al mismo. Esta referencia es almacenada
entonces en una variable. Así, todos los objetos de clase en C# deben ser colocados en memoria
dinámicamente.
Como podrías esperar, es posible separar la declaración minivan de la creación del objeto al
cual hará referencia, como se muestra aquí:
Vehículo minivan; // declara la referencia a un objeto
minivan = new Vehículo(); // coloca en memoria el objeto Vehículo

La primera línea declara minivan como referencia a un objeto tipo Vehículo. De esta manera,
minivan es una variable que puede hacer referencia a un objeto, pero no es un objeto en sí. La si-
guiente línea crea un nuevo objeto Vehículo y asigna a la variable minivan una referencia al mis-
mo. Ahora minivan está vinculada con un objeto.
El hecho de que los objetos de clase sean accesados a través de una referencia explica por qué
las clases son llamadas tipos de referencia. La diferencia clave entre los tipos de valor y los tipos
de referencia es el significado intrínseco de cada uno. En una variable tipo valor, la variable en sí
contiene el valor que le ha sido asignado. Por ejemplo, en el código:
Copyright © 2010. McGraw-Hill España. All rights reserved.

int x;
x = 10;

x contiene el valor 10, porque es una variable int, tipo de dato para almacenar valores. Sin embar-
go, en el caso de
Vehículo minivan = new Vehículo();

minvan no contiene en sí el objeto, sólo contiene una referencia al mismo.

Variables de referencia y asignaciones


En una operación de asignación, las variables de referencia actúan de manera diferente en compa-
ración con las variables de valor, como int. Cuando asignas una variable de valor a otra, la situa-
ción es muy clara: la variable del lado izquierdo recibe una copia del valor de la variable del lado
derecho. Cuando asignas una variable de referencia a otra, la situación es un poco más compleja,
porque provocas que la variable del lado izquierdo haga referencia al objeto que, a su vez, es re-

Schildt, Herbert. Fundamentos de C# 3.0, McGraw-Hill España, 2010. ProQuest Ebook Central, http://ebookcentral.proquest.com/lib/unadsp/detail.action?docID=3196018.
Created from unadsp on 2018-10-13 17:10:58.

También podría gustarte