Está en la página 1de 7

Saltar a contenido principal

Introducción a la programación con C#


Usted se ha identificado como Mariela Pavó (Salir)
Ruta a la página

 Página Principal
 / ► Mis cursos
 / ► P.O.O C#
 / ► Tema 3
 / ► Métodos. Creación de clases y objetos. Manejo de l...

Métodos. Creación de clases y objetos. Manejo de las


instancias
Lección #5

Lección #5 Título: Métodos. Creación de clases y objetos. Manejo de las instancias

Objetivo: Conocer la sintaxis específica de elementos principales de las clase como los
métodos y los objetos así como su propia declaración.

Contenidos:

 Métodos
 Clases y objetos
 Manejo de instancias

Sesión de Cuestionario:

Sesión Foro:

Métodos

Un método es un conjunto de acciones que se agrupan a través de un determinado nombre


simbólico de tal manera que es posible ejecutarlas en cualquier momento sin tener que
volver a escribirlas, sino usando sólo su nombre. A estas instrucciones se les denomina
cuerpo del método, y a su ejecución a través de su nombre se le denomina llamada al
método.
Los métodos son bloques de instrucciones que pueden devolver algún valor cuando se
ejecutan. Invocar a un método hace que las instrucciones del mismo se ejecuten. En las
instrucciones es posible acceder con total libertad a la información almacenada en los
campos de la clase a la cual pertenece el método. A continuación se presenta de forma
general la sintaxis de declaración de los métodos:

< Tipo devuelto > < Nombre simbólico del método > ([<Parámetros>])

           cuerpo

A su vez todo método puede devolver un objeto como resultado de haber ejecutado las
<instrucciones>. En tal caso el tipo del objeto devuelto tiene que coincidir con el
especificado en <TipoDevuelto>, y el método tiene que terminar con la cláusula return
<objeto>; En caso que se desee definir un método que no devuelva objeto alguno se omite
la cláusula return y se especifica void como <TipoDevuelto>.

Opcionalmente todo método puede recibir en cada llamada una arreglo de parámetros a los
que podrá acceder en la ejecución de las <instrucciones> del mismo. En <Parámetros> se
indican los tipos y nombres de estos parámetros y es mediante estos nombres con los que se
deberá referirse a ellos en el cuerpo del método.

Aunque los objetos que puede recibir el método como parámetro pueden ser diferentes cada
vez que se solicite su ejecución (llamado), siempre han de ser de los mismos tipos y seguir
el orden establecido en <Parámetros>.

La sintaxis usada para llamar a los métodos de un objeto es la misma que se utiliza para
acceder a sus campos, solo que además tras el nombre del método que se desea invocar
habrá que indicar entre paréntesis cuales son los valores que se desea dar a los parámetros.
O sea se escribe de la siguiente forma:

<objeto>.<nombre del método>([<valor de los parámetros>])

<objeto> no tiene que ser explícitamente el nombre de una variable, es cualquier expresión
que retorne como resultado un objeto.

A continuación, se muestra una aproximación de la definición de un método Promedio para


una clase.

Ejemplo clase estudiante.

class Estudiante;
{

            ...

int Promedio()

...

            ...

Es el momento propicio para citar un par de notas: “los términos método y función suelen
usarse de forma indistinta, pero hay una diferencia. Un método  es una función contenida
en una clase. Una función suele ser un grupo de instrucciones que no está contenido en una
clase y que suele estar en un lenguaje, como C o C++. Como en C# no se puede añadir
código fuera de una clase, usted nunca tendrá una función. Todos los métodos se encierran
en una clase. Un método no puede existir fuera de una clase”.

Tipo devuelto

Pregunta: ¿Por qué el método Promedio comienza con int?

La responsabilidad de este método es devolver el promedio de una instancia de Persona y


este valor devuelto siempre va a  ser un valor que pertenece al dominio de valores del
conjunto de los números enteros y una de las formas que existe en C# de representar
enteros es a través del tipo de dato básico int.

Pregunta: ¿Siempre los métodos tienen que retornar un valor?

La respuesta en este caso es NO.

Para la definición de los métodos que no retornan ningún valor es utilizada en C# la palabra
reservada void, como se muestra seguidamente a través del ejemplo de la clase
Cronómetro.

class Cronómetro;

            ...
void Arranca()

                              ...        

            ...

La ejecución de las acciones de un método puede producir como resultado un objeto de


cualquier tipo. A este objeto se le llama valor de retorno del método y es completamente
opcional, por lo tanto se pueden escribir métodos que no devuelvan ningún valor.

Parámetros de los métodos

class Persona

      string nombre;

      string apellidos;

      int añoNacimiento; 

      int Edad(int unAño)

            int tempEdad;

            tempEdad = unAño - añoNacimiento;

            return tempEdad;

      }

     string ToString()

      {

            return nombre + “  ” + apellidos;


      }

Otro elemento de interés en el método Edad (Ejemplo de arriba) de la clase Persona es la


combinación de símbolos que aparece entre paréntesis, “int unAño”.

Pregunta: ¿Cuáles son los datos o valores que necesita el método Edad() para cumplir con
su responsabilidad de retornar el valor de la edad (con relación a un año determinado) de
cualquier Persona?

En primer lugar necesita saber el año de nacimiento, hecho resuelto a través de la


responsabilidad añoNacimiento. En segundo lugar necesita conocer con respecto a que año
va a calcularse dicha edad y esto es desconocido en principio, además puede ser que en un
momento quisiera saber la edad de una persona en el año actual o hace 5 años. Es por ello
que aseguramos que le está faltando información al método Edad para cumplir con la
respectiva responsabilidad asignada. La referida información que está faltando es la que se
completa a través del parámetro int unAño.

Los parámetros son definidos entre paréntesis a continuación del nombre de la clase. Un
método puede contener varios parámetros (Arreglo de parámetros) o ninguno. En caso de
contener una lista de parámetros éstos van antecedidos por su tipo y separados por coma.
En caso contrario la lista de parámetros estaría vacía

Al conjunto formado por el nombre de un método y el número y tipo de sus parámetros se


le conoce como signatura o firma del método. La signatura de un método es lo que
verdaderamente lo identifica.

 Cuerpo del método

Se le denomina instrucción a toda acción que se pueda realizar en el cuerpo de un método,


como definir variables, llamar a métodos, asignaciones y más. Las instrucciones se agrupan
formando bloques de instrucciones (bloques de código), que son secuencias de
instrucciones encerradas entre llaves que se ejecutan una tras otra.

El cuerpo de un método es el bloque de instrucciones que compone el código del método,


por ejemplo

              return unAño - añoNacimiento;

al tomar como referencia el método Edad de la clase Persona.

Nótese en el código anterior la existencia de la palabra reservada return para especificar


precisamente el valor que va a retornar el método. Si se define un método que retorna un
valor, en C# es responsabilidad del programador garantizar que durante el desarrollo de las
acciones (instrucciones) del mismo se retorne siempre un valor, en caso contrario el
compilador reportará un error.

En caso de que el método no tenga que retornar ningún valor, simplemente no hay que usar
el return dentro del cuerpo.

Sobrecarga de métodos

Pregunta:     ¿Es posible ofrecer otra variante para la responsabilidad que determina la
edad en la clase Persona a través del mismo identificador Edad?

El referido método podría calcular la edad de una instancia de Persona a través del valor
retornado por el reloj interno de la máquina (el año en este caso), si existiese alguna forma
de obtener el mismo. Felizmente en la BCL existe una clase que dispone de esa
responsabilidad (System.DateTime.Now.Year).

Lo interesante de este planteamiento es que ahora la propuesta del método Edad dispone de
toda la información para dar un resultado ya que el año a comparar sería obtenido de la
referida forma desde el reloj interno de la máquina.

Pregunta: ¿Esto implica que no se necesita el parámetro?

Por supuesto que no, tómese que por otra parte se quiere brindar las dos facilidades, una
que calcule la edad a partir de un año dado  y otra que la calcule a partir del año actual
adquirido a través del reloj de la máquina. Evidentemente esta propuesta trae o conlleva a
interrogantes interesantes, pues como se ha decidido brindar las dos facilidades se tienen
que definir dos métodos para acceder a estas de forma independiente, puesto que sus
propuestas de solución difieren notablemente.

Pregunta: ¿Qué nombres llevarán estos métodos?

Lo que supuestamente es una respuesta evidente, conlleva a otra interrogante aún más
interesante. Como ambos métodos están definidos con el objetivo de calcular la edad de
una instancia de Persona el nombre más lógico con el cual se debe hacer referencia a cada
uno de ellos debe ser Edad, pues otro nombre se contradice con lo que realmente hace o con
el objetivo para lo cual fue diseñado. Luego en la clase Persona existirían dos métodos con
igual identificador, tipo devuelto y solo con la diferencia de que uno necesita de un
parámetro para establecer con respecto a que año se calcularía la edad, mientras que el otro
no necesita del parámetro porque la calcula respecto al año actual tomado del reloj de la
máquina.

Pregunta: ¿Puede contener una clase más de un método con igual identificador? En caso
positivo, ¿cómo el compilador es capaz de diferenciarlos?

La respuesta a la primera pregunta es afirmativa, C# permite que en una misma clase se


definan varios métodos con el mismo nombre siempre y cuando tomen diferentes número o
tipo de parámetros, o que en caso extremo si tienen igual número y tipo de parámetros se
diferencien en el orden de los mismos.

Situación de análisis

Analice la siguiente definición de clase.

class A

           ...

            int f(int x, int y){...}

            int f(string x, int y){...}

            int f(int x, int y, int z){...}

            int f(int y, string x){...}

            int f(int a, int b){...}

Pregunta:     ¿Qué reacción tiene el lenguaje ante las definiciones anteriores?

El ejemplo anterior consta de 5 definiciones del método f. Las cuatro primeras son
aceptadas por el lenguaje, ya que difieren en el tipo, la cantidad u orden de los parámetros.
El último caso no es correcto pues solo se diferencia del primero en los identificadores de
los parámetros. Este produce un error semántico puesto que existe un método previamente
definido que tiene dos parámetros enteros. Es decir, el nombre de los parámetros, no
establece diferencia alguna para la signatura de distintos métodos.

A la posibilidad de disponer de varios métodos con el mismo nombre, pero con diferente
lista de parámetros es lo que se conoce como sobrecarga de métodos y es posible ya que
cuando se les invoque el compilador podrá determinar a cual llamar a partir de los
parámetros pasados en la llamada.

Sin embargo, lo que no se permite es definir varios métodos que solamente se diferencien 
en su valor de retorno, puesto que la forma de invocar a los métodos a través de instancias
de la clase es

<objeto>.<nombre del método>([<valores de los parámetros>])

También podría gustarte