0% encontró este documento útil (0 votos)
23 vistas43 páginas

Ejercicios de POO en C#

El documento presenta conceptos básicos de programación orientada a objetos en C#, incluyendo clases, objetos y sus definiciones. También muestra ejemplos de uso de estructuras de control como if, else, while y for.

Cargado por

kike portillo
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
23 vistas43 páginas

Ejercicios de POO en C#

El documento presenta conceptos básicos de programación orientada a objetos en C#, incluyendo clases, objetos y sus definiciones. También muestra ejemplos de uso de estructuras de control como if, else, while y for.

Cargado por

kike portillo
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

[Año]

Compendio de POO-C#

EJERCITARIO DE C#
MSC. RUBÉN SANABRIA

2016 |
Introducción a C#

Comandos y sentencias

Utilización del if..else

// Ejemplo_02_01_06a.cs
// Condiciones con if: comparación incorrecta
// Introducción a C#

using System;
public class Ejemplo_02_01_06a {
public static void Main()
{
int numero;
Console.WriteLine("Introduce un número");
numero = Convert.ToInt32(Console.ReadLine());
if (numero = 0)
Console.WriteLine("El número es cero.");
else
if (numero < 0)
Console.WriteLine("El número es negativo.");
Else
Console.WriteLine("El número es positivo.");
}
}

Utilización del Case

// Ejemplo_02_01_09c.cs // La orden "switch" con cadenas de texto //


Introducción a C#
using System;
public class Ejemplo_02_01_09c
{
public static void Main() {
string nombre;
Console.WriteLine("Introduce tu nombre");
nombre = Console.ReadLine();
switch (nombre)
{
case "Juan": Console.WriteLine("Bienvenido, Juan.");
break;
case "Pedro": Console.WriteLine("Que tal estas, Pedro.");
break;

Ms. Ing. Rubén Sanabria B. 1


default:
Console.WriteLine("Procede con cautela, desconocido.");
break;
}
}
}

Utilización del While


// Ejemplo_02_02_01_01a.cs
// La orden "while": mientras...
// Introducción a C#

using System;
public class Ejemplo_02_02_01_01a
{
public static void Main()
{
int numero;
Console.Write("Teclea un número (0 para salir): ");
numero = Convert.ToInt32(Console.ReadLine());
while (numero != 0)
{
if (numero > 0)
Console.WriteLine("Es positivo");
Else
Console.WriteLine("Es negativo");
Console.WriteLine("Teclea otro número (0 para salir): ");
numero = Convert.ToInt32(Console.ReadLine());
}
}
}
Utilización del do..while
// Ejemplo_02_02_02a.cs // La orden "do..while" (repetir..mientras) //
Introducción a C#
using System;
public class Ejemplo_02_02_02ª
{
public static void Main()
{
int valida = 711;
int clave;
do
{
Console.Write("Introduzca su clave numérica: ");
clave = Convert.ToInt32(Console.ReadLine());
if (clave != valida)
Console.WriteLine("No válida!");
}
while (clave != valida);
Console.WriteLine("Aceptada.");

Ms. Ing. Rubén Sanabria B. 2


}
}

Utilización del for


// Ejemplo_02_02_05a.cs // "for" anidados // Introducción a C

using System;
public class Ejemplo_02_02_05a
{
public static void Main()
{
int tabla, numero;
for (tabla=1; tabla<=5; tabla++)
for (numero=1; numero<=10; numero++)
Console.WriteLine("{0} por {1} es {2}", tabla, numero,
tabla*numero);
}
}

Utilización del array


// Ejemplo_04_01_01a.cs
// Primer ejemplo de tablas (arrays)
// Introducción a C#

using System;

public class Ejemplo_04_01_01


{
public static void Main()
{
int[] numeros = new int[5]; // Un array de 5 números enteros
int suma; // Un entero que será la suma
numeros[0] = 200; // Les damos valores
numeros[1] = 150;
numeros[2] = 100;
numeros[3] = -50;
numeros[4] = 300;
suma = numeros[0]+numeros[1]+numeros[2]+numeros[3]+numeros[4];
Console.WriteLine("Su suma es {0}", suma);
// Nota: esta es la forma más ineficiente e incómoda
// Lo mejoraremos...
}
}

Darle un valor inicial a un array


// Ejemplo_04_01_02a.cs
// Segundo ejemplo de tablas: valores iniciales con []
using System;
public class Ejemplo_04_01_02a {
public static void Main()

Ms. Ing. Rubén Sanabria B. 3


{
int[] numeros = {200, 150, 100, -50, 300};
int suma; // Un entero que será su suma
suma = numeros[0] + numeros[1] + numeros[2] + numeros[3] + numeros[4];
Console.WriteLine("Su suma es {0}", suma);
// Nota: esta forma es algo menos engorrosa, pero todavía no está bien
hecho. Lo seguiremos mejorando.
}
}

Ejemplo utilizando For…


// Ejemplo_04_01_03a.cs
// Tercer ejemplo de tablas: valores iniciales con llaves
// y recorrido con "for"

using System;
public class Ejemplo_04_01_03a {
public static void Main() {
int[] numeros = {200, 150, 100, -50, 300};
int suma; // Un entero que será su suma
suma = 0; // Valor inicial de la suma: 0
for (int i=0; i<=4; i++) // Y calculamos la suma repetitiva
suma += numeros[i];
Console.WriteLine("Su suma es {0}", suma);
}
}

Ms. Ing. Rubén Sanabria B. 4


Programación Orientada a Objetos en C#

El paradigma de programación orientada a objetos ha sido el estilo de programación que ha permitido


revolucionar el desarrollo de software en la informática moderna. A pesar de que se afirma que cualquier
programa desarrollado bajo el modelo de programación orientada a objetos, también se hubiera podido
desarrollar con el paradigma de programación estructurada, la verdad es que las cosas que se han logrado
en materia de software son más fáciles de concebir, diseñar y programar con la noción de objetos que con
la programación netamente estructurada. La orientación a objetos es un modelo que utiliza nociones del
mundo real, en el cual vivimos los seres humanos, donde encontramos objetos por todas partes, los cuales
se relacionan, interactúan y se asocian para permitir la solución de un problema, se pueden manipular
individualmente o en conjunto, e incluso muchos de ellos pueden poseer o adquirir comportamiento
inteligente.

Clases
La clase es el elemento fundamental de la programación orientada a objetos con el lenguaje C#. Aunque,
dentro de este modelo de programación, existen muchas definiciones válidas para el concepto de clase, en
la práctica una clase no es más que una plantilla de software que sirve para construir cualquier cantidad de
objetos. Por ejemplo, en .NET existe una clase llamada Form que sirve como molde para construir cualquier
ventana que necesite una aplicación tipo Windows. Las ventanas que nosotros observamos en la pantalla
de nuestro computador, son los objetos generados con esa plantilla. Pueden haber muchos objetos
generados con esa plantilla, pero lo que los puede hacer diferentes a unos de otros, son los valores que se
asignan a sus atributos como: alto, ancho, color, título, etc.

Pero, por ahora volvamos a nuestra realidad que nos exige a nosotros definir los tipos o clases que el
entorno de desarrollo no haya definido, o que siendo tantos, no sepamos que ya existen, y que los
necesitemos para nuestros programas. En C# una clase se define mediante la palabra clave class y una
sintaxis básica que encontramos para definirla, es la siguiente:

class NombreClase

{
//Miembros
}

Sin embargo, las clases deben cumplir unos niveles de seguridad que exigen el manejo del control de
accesibilidad a ellas, sobre todo por parte de agentes externos al proyecto de software donde se hayan
definido. Es por esto que la definición de cualquier clase debe ir antecedida de una palabra clave que
determina la accesibilidad que admite dicha clase. La sintaxis C# para definir una clase es la siguiente:

[public | private | protected | internal]

class NombreClase {

Ms. Ing. Rubén Sanabria B. 5


// Miembros
}

La sección entre corchetes, que indica las palabras clave de accesibilidad, public, private, protected,
internal, que pueden utilizarse en la definición de una clase, es opcional e indica cual es el nivel de acceso
que se va a permitir sobre la clase. Si no se especifica ningún nivel de accesibilidad, el compilador la define
por defecto como internal, lo cual significa que solo se permite el acceso a las clases que hacen parte del
mismo ensamblado. Mediante las palabras de accesibilidad se pueden especificar los siguientes cinco
niveles de protección para una clase:

Objetos
Cuando se diseña y programa una aplicación de software con el modelo de programación orientada a objetos,
lo que se hace en la práctica es construir un conjunto de plantillas de objetos, o lo que se conoce como clases,
las cuales permiten definir variables en memoria que se conocen con el nombre de objetos o instancias1 de
clase.
Desde esta perspectiva, el término clase gana mayor significado, ya que se puede definir como una plantilla
que permite generar una clase de objetos.
Para crear un objeto de una determinada clase, se procede básicamente en dos pasos:
primero se declara una variable con el tipo que representa la clase y luego se le asigna memoria con el
operador new. Por ejemplo, tomando la clase Complejo definida anteriormente, la siguiente línea crea un
objeto a partir de esta plantilla:
Complejo z;

Cuando el programa ejecuta esta línea, solo posee una dirección de memoria donde se inicia la estructura de
la variable z. Para asignarle la memoria total conforme al tamaño de la estructura que describe la clase, es
necesario aplicar el operador new, así:

z = new Complejo();

A partir de aquí, el sistema conoce con exactitud la ubicación y tamaño ocupado en memoria por la
variable z y estará en condiciones de colocar en el sitio que corresponda cada uno de los datos y demás
elementos que conforman el objeto.
En C#, tanto la declaración como la asignación de memoria para un objeto puede hacerse en una sola línea
de código, como se muestra enseguida para nuestro ejemplo:

Ms. Ing. Rubén Sanabria B. 6


Complejo z = new Complejo();

Utilización de las clases en C#

La representación gráfica de una clase es la siguiente:

Donde dicho gráfico se escribe así:


using System;

namespace poo1
{
public class Clase
{
static int atributo1,atributo2;
static int sumar;

public static void Main()


{
Clase obj = new Clase();
obj.calcular();
Console.WriteLine("La suma es..{0}",sumar);

Console.ReadKey();
}
private void calcular()
{
atributo1 = 15;
atributo2 = 17;
sumar = atributo1+atributo2;
}
}
}

Ms. Ing. Rubén Sanabria B. 7


2- Sumar dos números y mostrar el resultado
using System;

namespace poo1
{
public class Dos
{
public static void Main(string[] args)
{
int aa, bb, suma;
aa = 20;
bb = 34;
suma = aa+bb;
Console.Write("La suma es..{0}",suma);
Console.ReadKey(true);
}

}
}
Resultado

3-Hallar la distancia entre dos puntos, ingrese los valores

using System;

namespace poo1
{
public class tres
{
static int x1,y1,x2,y2;
static double raiz;

public static void Main(string[] args)


{
tres obj = new tres();
obj.ingresaDatos();
obj.calcular();
Console.ReadKey();
}

private void ingresaDatos()


{
Console.WriteLine("Ingrese el valor de x1");
x1 = Convert.ToInt16(Console.ReadLine());
Console.WriteLine("Ingrese el valor de y1");
y1 = Convert.ToInt16(Console.ReadLine());
Console.WriteLine("Ingrese el valor de x2");
x2 = Convert.ToInt16(Console.ReadLine());

Ms. Ing. Rubén Sanabria B. 8


Console.WriteLine("Ingrese el valor de y2");
y2 = Convert.ToInt16(Console.ReadLine());

}
private void calcular()
{
raiz = Math.Sqrt(Math.Pow((x2-x1),2)+Math.Pow((y2-y1),2));
Console.WriteLine("La distancia hallada es {0}",raiz);
}

}
}

Resultado

4- Halla el perímetro y el área de un cuadrado de 3 m de lado

using System;

namespace poo1
{
/// <summary>
/// Description of Cuatro.
/// </summary>
public class Cuatro
{
static double perimetro,area,lado;

public static void Main(string[] args)


{
lado = 3;
Cuatro obj = new Cuatro();
obj.calculaPerimetro();
obj.calculaArea();
Console.ReadKey();
}
private void calculaPerimetro()
{
perimetro = lado * 4;
Console.WriteLine("El perimetro es.. {0}",perimetro);
}
private void calculaArea()

Ms. Ing. Rubén Sanabria B. 9


{
area = Math.Pow(lado,2);
Console.WriteLine("El area es.. {0}",area);
}

Resultado

Clases estáticas y dinámicas

Una clase estática es básicamente igual que una clase no estática, pero existe una diferencia: no se pueden
crear instancias de una clase estática. En otras palabras, no puede utilizar la palabra clave new para crear
una variable del tipo clase. Dado que no hay ninguna variable de instancia, el acceso a los miembros de
una clase estática se realiza mediante el propio nombre de clase. Por ejemplo, si cuenta con una clase
estática que se denomina UtilityClass e incluye un método público denominado MethodA, la llamada al
método se realiza tal como se muestra en el ejemplo siguiente:

UtilityClass.MethodA();

Una clase estática se puede utilizar como un contenedor adecuado para los conjuntos de métodos que solo
funcionan en parámetros de entrada y no tienen que obtener ni establecer campos internos de
instancia. Por ejemplo, en la biblioteca de clases .NET Framework, la clase estática System.Math contiene
varios métodos que realizan operaciones matemáticas, sin ningún requisito para almacenar o recuperar
datos únicos de una instancia determinada de la clase Math. Es decir, los miembros de la clase se aplican
especificando el nombre de la clase y del método, como se muestra en el ejemplo siguiente.

double dub = -3.14;


Console.WriteLine(Math.Abs(dub));
Console.WriteLine(Math.Floor(dub));
Console.WriteLine(Math.Round(Math.Abs(dub)));

// Output:
// 3.14
// -4
// 3

Ms. Ing. Rubén Sanabria B. 10


En la clase estática no necesita que se instancie la clase, como se verá en el ejemplo
siguiente, que también tiene una clase dinámica:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace estructuraencsharp
{
class Estatico
{
static float altura, bases;
static void Main()
{
bases = 10;
altura = 15; Clase estática
area_triangulo();
//llamo a la clase figura geometrica
figura_geometrica.altura = 12;
Otra forma de
figura_geometrica.bases = 5; Clase estática
figura_geometrica.area_triangulo();
//llamo a la clase figura_geometrica -->dinamica
figura_geometrica2 objeto = new figura_geometrica2();
objeto.altura = 27;
Clase dinámica,
objeto.bases = 32; se crea la clase
objeto.area_triangulo(); con la instancia
new
Console.ReadKey();
}
static void area_triangulo()
{
Console.WriteLine("area del triangulo es " + (bases * altura) / 2);
}
}

class figura_geometrica
{
public static float altura, bases;

public static void area_triangulo()


{
Console.WriteLine("area del triangulo(figura) es " + (bases * altura) / 2);
}
}

class figura_geometrica2
{
public float altura, bases;

public void area_triangulo()


{
Console.WriteLine("area del triangulo(figura2) es " + (bases * altura) / 2);
}
}

Ms. Ing. Rubén Sanabria B. 11


}
Resultado:

5. Declarar una clase llamada Circunferencia que tenga como atributo privado el radio
de tipo real y los siguientes métodos:
a) Calcular el área.
b) Calcular el perímetro.
c) Método para modificar el radio
d) Método para consultar el valor del radio

Declare dos objetos: Rueda y Moneda y realice las siguientes operaciones:


a) Inicialice el radio de la Ruedacon el valor de 10.2
b) Inicialice el radio de la Monedacon el valor de 1.4
c) Imprima el área de la Rueda.

3. Definir una clase Rectángulo de acuerdo al siguiente diagrama de clases en UML:

Ms. Ing. Rubén Sanabria B. 12


Utilice esta clase para resolver el siguiente problema:
Hay una pared rectangular que tiene una ventana rectangular; se requiere un programa que dadas las
dimensiones (largo y ancho) de la ventana y de la pared muestre en la pantalla el tiempo necesario
para pintar la pared si se sabe que se puede pintar 1 m2 en 10 minutos.
4. Modifique la clase del ejercicio 3 y sustituya los métodos ModificarLargo(), ModificarAncho(),
ConsultarLargo() y ConsultarAncho() por sus respectivas propiedades.

5. Define la clase Fecha, de acuerdo con las siguientes especificaciones:


Atributos:
• día
• mes
• año
Constructores:
• Que inicialice con una fecha fija que tu definas
• Que reciba como parámetro los valores para inicializar la fecha
Métodos públicos:
• Que permita modificar el valor de la fecha
• Que muestre en la pantalla la fecha usando el formato dia / mes / año
• Que muestre en la pantalla la fecha poniendo el mes con palabras

Ms. Ing. Rubén Sanabria B. 13


• Que permita verificar si una fecha es válida; este método debe ser utilizado por el
constructor y el método que modifica el valor de la fecha, si el usuario trata de
inicializar con una fecha inválida se inicializará con el valor fijo que tu hayas definido.
Realiza después una aplicación para probar tu clase, debe al menos crear 2 objetos de
tipo Fecha, utilizando cada uno de los constructores y después mostrar las fechas
correspondientes en la pantalla.

6. Definir una clase para manejar los artículos de un supermercado cuyo diagrama de
UML se muestra a continuación:

Declare y cree un objeto, modifique sus valores e imprima el valor del IVA
correspondiente.

7. Implemente una clase para almacenar una temperatura dada en grados centígrados y la
convierta a grados Fahrenheit, de acuerdo a la fórmula (despeje la variable):

Ms. Ing. Rubén Sanabria B. 14


Utilice el siguiente diagrama de la clase en UML:

8. Una persona desea cambiar pesos a dólares y requiere un sistema


orientado a objetos. Para ello, define la siguiente clase:

Cree un objeto e inicialice el tipo de cambio (utilice el constructor con


parámetro), luego asigne la cantidad de pesos e imprima la conversión a
dólares.

Ms. Ing. Rubén Sanabria B. 15


VECTORES

1- -Ingrese el tamaño de un vector, también ingrese los elementos de dicho vector, luego imprimir
los elementos del vector creado.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace estructuraencsharp
{
class Array1
{
static int n;
static int[] a;
public static void Main()
{
Array1 vec = new Array1();
vec.tamanio();
vec.cargar_datos();
vec.mostrar_datos();

Console.ReadKey();
}
private void tamanio()
{
Console.WriteLine("Ingrese el tamanio del vector: ");
n = Convert.ToInt32(Console.ReadLine());
if(n>0)
a = new int[n];
else
tamanio();
}
public void cargar_datos(){
for(int x=0; x<n; x++)
{
Console.WriteLine("Ingrese el valor["+x+"]: ");
int num = Convert.ToInt32(Console.ReadLine());
if (num > 0)
a[x] = num;
else
x--;
}
}
public void mostrar_datos(){
for(int x=0; x<n; x++)
Console.WriteLine(a[x]+" ");
}
}
}

Ms. Ing. Rubén Sanabria B. 16


Resultado:

MATRICES

1- Crear una matriz de 3 filas por 5 columnas, con elementos de tipo int, cargar dicha matriz, luego
imprimir la matriz nueva.
using System;
namespace poo1
{
public class Matriz1
{
private int[,] mat;
public static void Main(string[] args)
{
Matriz1 ma = new Matriz1();
ma.Cargar();
ma.Imprimir();
}

private void Cargar()


{
mat=new int[2,3];
for(int f = 0;f < 3;f++)
{
for(int c = 0;c < 5;c++)
{
Console.Write("Ingrese componente:");
string linea;
linea = Console.ReadLine();
mat[f,c]=int.Parse(linea);
}
}
}
private void Imprimir()

Ms. Ing. Rubén Sanabria B. 17


{
for(int f = 0;f < 3;f++)
{
for(int c = 0;c < 5;c++)
{
Console.Write(mat[f,c]+" ");
}
Console.WriteLine();
}
Console.ReadKey();
}
}
}

2- Crear y cargar una matriz de 4 filas por 4 columnas. Imprimir la diagonal principal.
using System;
namespace poo1
{
public class Matriz2
{
private int[,] mat;
public static void Main(string[] args)
{
Matriz2 ma = new Matriz2();
ma.Cargar();
ma.verDiagonalPrincipal();
}

private void Cargar()


{
mat=new int[3,3];
for(int f = 0; f < 3; f++)
{
for(int c = 0; c<3; c++)
{
Console.Write("Ingrese componente:");
string linea;
linea = Console.ReadLine();
mat[f, c] = int.Parse(linea);
}
}
}

private void verDiagonalPrincipal()


{
for(int k = 0; k < 4; k++)
{
Console.Write(mat[k,k]+" ");
}
Console.ReadKey();
}

Ms. Ing. Rubén Sanabria B. 18


}
}

HERENCIA

La herencia, junto con la encapsulación y el polimorfismo, es una de las tres características principales
(o pilares) de la programación orientada a objetos. La herencia permite crear nuevas clases que reutilizan,
extienden y modifican el comportamiento que se define en otras clases. La clase cuyos miembros se
heredan se denomina clase base y la clase que hereda esos miembros se denomina clase derivada. Una
clase derivada solo puede tener una clase base directa. Sin embargo, la herencia es transitiva. Si ClassC se
deriva de ClassB y ClassB se deriva de ClassA, ClassC hereda los miembros declarados en ClassB y ClassA.
Gráfico de ejemplo

Ejemplo de herencia

using System;
using poo1;

namespace poo1
{
public class Herencia
{
static void Main(string[] args)
{
Suma objetosuma = new Suma();
objetosuma.Valor1 = 16;
objetosuma.Valor2 = 42;
objetosuma.Sumar();
Console.WriteLine("La suma de " + objetosuma.Valor1 + " y " +
objetosuma.Valor2 + " es " + objetosuma.Resultado);
//
Resta objetoresta = new Resta();

Ms. Ing. Rubén Sanabria B. 19


Vemos que está heredando de la
objetoresta.Valor1 = 25; superclase Encapsulado
objetoresta.Valor2 = 10;
objetoresta.Restar();
Console.WriteLine("La resta de " + objetoresta.Valor1 + " y " +
objetoresta.Valor2 + " es " + objetoresta.Resultado);

Console.ReadKey();
}
}

public class Encapsulado


{
private int valor1,valor2,resultado;
public int Valor1(){
get { return valor1; }
set { valor1 = value; }
}
public int Valor2(){
get { return valor2; }
set { valor2 = value; }
}
public int Resultado(){
get { return resultado; }
set { resultado = value; }
}

} //fin encapsulado

public class Suma:Encapsulado


{
public void Sumar()
{
Resultado=Valor1+Valor2;
}
}
public class Resta:Encapsulado
{
public void Restar()
{
Resultado=Valor1-Valor2;
}
}
}

Ms. Ing. Rubén Sanabria B. 20


ENCAPSULAMIENTO

La operación de refactorización Encapsular campo (Encapsulate Field) permite crear rápidamente una
propiedad a partir de un campo existente y, a continuación, actualizar sin problemas el código con
referencias a la nueva propiedad.

Cuando un campo es público, los otros objetos tendrán acceso directo a ese campo y podrán modificarlo,
sin que el objeto que posee el campo lo detecte. Mediante propiedades que encapsulen ese campo, se
puede deshabilitar el acceso directo a los campos.

Para crear la nueva propiedad, la operación Encapsular campo cambia el modificador de acceso del campo
que desea encapsular a privado y, a continuación, genera descriptores de acceso get y set para ese campo.
En algunos casos solo se genera un descriptor de acceso get, como cuando el campo se declara de solo
lectura.

Se tiene variables del tipo :

public class Encapsulado


{
private int valor1,valor2,resultado;
public int Valor1(){
get { return valor1; }
set { valor1 = value; }
}
public int Valor2(){
get { return valor2; }
set { valor2 = value; }
}
public int Resultado(){
get { return resultado; }
set { resultado = value; }
}

} //fin encapsulado

Su representación gráfica sería :

Ms. Ing. Rubén Sanabria B. 21


POLIMORFISMO

El polimorfismo suele considerarse el tercer pilar de la programación orientada a objetos, después de la


encapsulación y la herencia. Polimorfismo es una palabra griega que significa "con muchas formas" y tiene
dos aspectos diferentes:

En tiempo de ejecución, los objetos de una clase derivada pueden ser tratados como objetos de una clase
base en lugares como parámetros de métodos y colecciones o matrices. Cuando ocurre, el tipo declarado
del objeto ya no es idéntico a su tipo en tiempo de ejecución.

Las clases base pueden definir e implementar métodos virtuales y las clases derivadas pueden
invalidarlos, lo que significa que pueden proporcionar su propia definición e implementación. En tiempo
de ejecución, cuando el código de cliente llama al método, CLR busca el tipo en tiempo de ejecución del
objeto e invoca esa invalidación del método virtual. Por lo tanto, en el código fuente puede llamar a un
método en una clase base y hacer que se ejecute una versión del método de la clase derivada.

Los métodos virtuales permiten trabajar con grupos de objetos relacionados de manera uniforme. Por
ejemplo, supongamos que tiene una aplicación de dibujo que permite a un usuario crear varios tipos de
formas en una superficie de dibujo. En tiempo de compilación, no sabe qué tipos específicos de formas
creará el usuario. Sin embargo, la aplicación tiene que realizar el seguimiento de los distintos tipos de
formas que se crean, y tiene que actualizarlos en respuesta a las acciones del mouse del usuario. Para
solucionar este problema en dos pasos básicos, puede usar el polimorfismo:

1. Crear una jerarquía de clases en la que cada clase de forma específica deriva de una clase base
común.
2. Usar un método virtual para invocar el método apropiado en una clase derivada mediante una sola
llamada al método de la clase base.

Ejercicio

1-Se tiene un vehículo al que se le pasa diferentes valores, como color, marca, cantidad de puertas

using System;

namespace poo1
{

public class Polimorfismo


{
static String color,marca;
static int puerta;
static void Main(string[] args)
{
Polimorfismo auto = new Polimorfismo();
auto.miVehiculo();

Ms. Ing. Rubén Sanabria B. 22


//
auto.miVehiculo("Rojo","Peugeot",2);
Console.ReadKey();
}

private void miVehiculo()


{
color = "blanco";
marca = "Mercedes Benz";
puerta = 4;
Console.WriteLine("mi auto es de color "+color+" marca "+marca );
Console.WriteLine(" y de "+puerta+" puertas");
}
private void miVehiculo(String color,String marca,int puerta)
{
Console.WriteLine("mi auto es de color "+color+" marca "+marca );
Console.WriteLine(" y de "+puerta+" puertas");
}

}
}

2-Una institución educativa quiere saber las calificaciones de alumnos, ingrese datos a un libro de
calificaciones, visualícelo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Polimorfismo1
{
class Program
{
static void Main(string[] args)
{
Libros miNota1 = new Libros();
List<int> calificacion = new List<int>();

Console.WriteLine("Ingrese Nota1 :");


miNota1.Notas = Convert.ToInt32(Console.ReadLine());

Ms. Ing. Rubén Sanabria B. 23


calificacion.Add(miNota1.Notas);
Console.WriteLine("Ingrese Nota2 :");
miNota1.Notas = Convert.ToInt32(Console.ReadLine());
calificacion.Add(miNota1.Notas);
Console.WriteLine("Ingrese Nota3 :");
miNota1.Notas = Convert.ToInt32(Console.ReadLine());
calificacion.Add(miNota1.Notas);

//imprime notas
Console.WriteLine("Mis notas son: ");
foreach (int misNotas in calificacion)
{
Console.WriteLine(misNotas);
}
Console.ReadKey();
}

}
}

Y en la clase Libros.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Polimorfismo1
{
class Libros
{
private int notas;
public int Notas
{
get { return notas; }
set { notas = value; }
}
}

El resultado es :

Ms. Ing. Rubén Sanabria B. 24


WINDOW FORM
Los formularios en C#, heredan de la superclase Form.

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace POO2
{
public partial class MainForm : Form Aquí vemos como esta
{ heredando de la
public MainForm() superclase Form
{
InitializeComponent();
}
}
}

y nos muestra el siguiente formulario

Ejercicio 1

Ingresar datos en los campos de textos, luego sumarlos, visualizar en otro campo resultado,
mediante el evento click() del botón ejecutar.

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace POO2
{
public partial class MainForm : Form
{
static double nro1,nro2,resultado;
public MainForm()

Ms. Ing. Rubén Sanabria B. 25


{
InitializeComponent();
}
void Button1Click(object sender, EventArgs e)
{
nro1 = Convert.ToDouble(textBox1.Text);
nro2 = Convert.ToDouble(textBox2.Text);
resultado = nro1+nro2;
textBox3.Text = Convert.ToString(resultado);
MessageBox.Show("el resultado es "+resultado);
}
}
}

El resultado nos muestra así:

Ejercicio 2

Agregar Datos a una lista mediante un listview, uitilizando windowsform, con el botón agregar,
borrar y salir

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace form01
{

public partial class MainForm : Form


{
public MainForm()
{
InitializeComponent();
limpiar();

Ms. Ing. Rubén Sanabria B. 26


}

void Button1Click(object sender, EventArgs e)


{
ListViewItem registro;
registro = listView1.Items.Add(this.textBox1.Text);
registro.SubItems.Add(this.textBox2.Text);
registro.SubItems.Add(this.textBox3.Text);
limpiarTxt();
textBox1.Focus();
}

private void limpiarTxt()


{
textBox1.Clear();
textBox2.Clear();
textBox3.Clear();
}
void Button3Click(object sender, EventArgs e)
{
Close();
}
void Button2Click(object sender, EventArgs e)
{
//borrar
for(int i = listView1.SelectedItems.Count -1;i>=0;i--){
listView1.Items.Remove(listView1.SelectedItems[i]);
}
}
}
}.

Resultado

Ms. Ing. Rubén Sanabria B. 27


Ejercicio 3

Esta aplicación nos permite ingresar el nombre del producto, precio anterior y precio actual,
luego nos permite calcular el alza en Guaraníes y el alza en porcentajes. El alza en porcentaje
es igual al alza en Guaraníes por 100 entre el precio anterior.

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace dos
{
public partial class MainForm : Form
{
static double vant,vact,valz,valp;
public MainForm()
{
InitializeComponent();
}
void Button3Click(object sender, EventArgs e)
{
Close();
}
void Button1Click(object sender, EventArgs e)
{
limpiartxt();
textBox1.Focus();
}
private void limpiartxt(){
textBox1.Clear();
textBox2.Clear();
textBox3.Clear();
textBox4.Clear();
textBox5.Clear();
}
void Button2Click(object sender, EventArgs e)
{
valz = Convert.ToDouble(textBox3.Text)-Convert.ToDouble(textBox2.Text);
valp = (valz * 100)/Convert.ToDouble(textBox2.Text);
textBox4.Text = Convert.ToString(valz);
textBox5.Text = Convert.ToString(valp);
}
}
}

Ms. Ing. Rubén Sanabria B. 28


Resultado

Ejercicio 3

Calcular el salario de la persona ingresada en el formulario, ingresar Horas Extras Trabajadas,


por el Monto Horas Extras, descontar con Descuento Social, otros Descuentos. Calcular el
Salario Bruto.

MENU y llamadas a otros formularios

Ms. Ing. Rubén Sanabria B. 29


Haciendo click en la opción se llama al formulario 2

private void ingreseHorasToolStripMenuItem_Click(object sender, EventArgs e)


{
Form1 frm = new Form1();
frm.Show();

Ms. Ing. Rubén Sanabria B. 30


SISTEMA DESKTOP

Patrón MVC. Modelo Vista Controlador


¿Qué es MVC?

MVC acrónimo de Modelo Vista Controlador mejor conocido en ingles como Model View
Controller, aunque hoy en día la definición de este varía entre distintos autores y/o tecnologías sobre
la que se implemente, es decir mientras para algunos es un patrón de diseño o un tipo de arquitectura
de software o incluso hasta un framework, para Microsoft en lo particular ASP.NET es un todo en
uno, ya que cuenta con un framework para desarrollar aplicaciones Web eficaces, altamente
testables y fáciles de mantener, todo esto sacando provecho del patrón de diseño MVC.

De igual manera se le conoce como una arquitectura, siendo que separa nuestras aplicaciones en tres
componentes principales, tales como un Modelo de datos, las Vista y los Controladores.

a) - Diagrama MVC

En el diagrama a) se muestra de manera general el funcionamiento de este patrón, empezando por


el controlador quien se encarga de recibir las peticiones al servidor web, además de interactuar
con el modelo para realizar las transacciones y/o actualizaciones, una vez terminados los cambios
o la extracción de datos solicitados al controlador, este mismo empuja hacia la vista el modelo de
datos resultante de la petición inicial, logrando así la actualización de la interfaz de usuario (UI).

MVC es un patrón arquitectónico cuyo principal propósito es establecer una separación clara entre la interfaz
de usuario que presenta la aplicación y la lógica de negocio que maneja la aplicación. Se trata de un patrón
antiguo, se remonta a los años a finales de los años 70, pero que ahora vive una nueva época de esplendor
gracias a su intensa utilización en los entornos de desarrollo web.

ASP.NET MVC es el framework que propone Microsoft para el desarrollo web utilizando el patrón MVC
sobre la tecnología ASP.NET. Esto, que a priori puede parecer evidente tiene una consecuencia inmediata:

Ms. Ing. Rubén Sanabria B. 31


gran parte de los que podamos saber de ASP.NET WebForms es aplicable en ASP.NET MVC: Modelo de
objetos integrado (Server, Response, Request …),Seguridad (API Membership),Modulos HTTP,Handlers …

Los elementos que componen el patrón son los siguientes:

 El controlador. Es el elemento encargo de recibir y procesar la peticiones HTTP. Su responsabilidad es


retornar una vista concreta con el modelo correcto.
 El modelo. Corresponde con la representación de los datos/entidades de negocio que modelan la aplicación.
 La vista. El contenido que va a ser devuelto como consecuencia de la petición HTTP. La vista recibe el
modelo para poder realizar la presentación de los datos.

El siguiente diagrama ilustra el proceso.

Aplicado a la ASP.NET MVC, el diagrama funciona de la siguiente manera:

 El navegador realiza un petición a una determinada URL.


 ASP.NET MVC recibe la petición y determinar el controlador que debe ejecutarse (veremos más adelante
como se realiza este proceso).
 El controlador:
o Recibe la petición HTTP.
o Procesa los datos, y crea u obtiene el modelo.
o Retorna una vista, a la que normalmente le asigna el modelo (aunque no es necesario establecer un modelo).
 La vista que ha retornado el controlador, es interpretada por el motor de renderización de ASP.NET MVC
«Razor», que procesa la vista para generar el documento HTML que será devuelto finalmente al navegador
 El navegador muestra la página.

Nota: ASP.NET MVC dispone de varios motores de renderización – Razor, aspx, - , en este tutorial
utilizaremos Razor.

Ms. Ing. Rubén Sanabria B. 32


Nota: Los controladores pueden devolver diferentes tipos de contenido no solo documentos HTML, aunque
en el dibujo se especifica únicamente HTML para simplificar el concepto.

Es por tanto, el controlador el encargado de coordinar la ejecución, generar el modelo y devolver la vista.

La estructura de las carpetas se verían de la siguiente forma :

Y las clases contenidas dentro de cada carpeta, como vemos los principales son el Modelo, Vistas,
Controladores :

Ms. Ing. Rubén Sanabria B. 33


Controladores :
- Referencia a los DAO, Data Access Objet,
Objeto de Acceso a Datos.

Vistas:
- Referencia a los formularios utilizados en el
sistema.
Modelos :
- Referencia a los atributos del sistema,
próximos a las tablas, del sistema.

MENU PRUNCIPAL

Ms. Ing. Rubén Sanabria B. 34


CREAR FORMULARIOS
Formulario Cargos

Así luciría mostrando los datos en el datagridView, tab Ventana

Así luciría mostrando el tab de Datos

CREAR LAS VISTAS (capa Views)

CREAR LOS MODELOS (carpeta Models)

Crea la clase CargosBean.cs

Ms. Ing. Rubén Sanabria B. 35


using System;

namespace sueldos1.Modelos
{
public class CargosBean
{
Public int Cod{get;set;}
Public string Nom{get;set;}
public CargosBean()
{
}
}
}

Clase DConexión.cs

using System;

namespace sueldos1.capaDatos
{
public class DConexion
{
public static string conex = "DSN=sueldo";
}
}

CREAR LOS CONTROLADORES (carpeta Controllers)

Clase CargosDAO.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Odbc;
using sueldos1.Modelos;

namespace sueldos1.Controladores
{
public class CargosDAO
{
OdbcConnection cone = new OdbcConnection(Conexion.conex);
public void insertar(CargosBean obj)
{
try
{
CargosBean bean = new CargosBean();
string sql = "Insert into cargos (codigo,descripcion) "
+"VALUES ('"+obj.Cod+"','"+obj.Nom+"')";
OdbcCommand cmd = new OdbcCommand(sql);
cmd.Connection = cone;

Ms. Ing. Rubén Sanabria B. 36


cmd.CommandType = CommandType.Text;
cone.Open();
cmd.ExecuteNonQuery();
cone.Close();
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
finally
{
if (cone.State == ConnectionState.Open)
cone.Close();
}
}

public void modificar(CargosBean obj)


{
try
{
CargosBean bean = new CargosBean();
string sql = "UPDATE cargos SET descripcion = '"+obj.Nom+"'"
+" WHERE codigo='"+obj.Cod+"'";
OdbcCommand cmd = new OdbcCommand(sql);
cmd.Connection = cone;
cmd.CommandType = CommandType.Text;
cone.Open();
cmd.ExecuteNonQuery();
cone.Close();

}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
finally
{
if (cone.State == ConnectionState.Open)
cone.Close();
}
}

//delete
public void eliminar(CargosBean obj)
{
try
{
CargosBean bean = new CargosBean();
string sql = "DELETE FROM cargos WHERE codigo='"+obj.Cod+"'";
OdbcCommand cmd = new OdbcCommand(sql);
cmd.Connection = cone;
cmd.CommandType = CommandType.Text;
cone.Open();
cmd.ExecuteNonQuery();
cone.Close();

Ms. Ing. Rubén Sanabria B. 37


}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
finally
{
if (cone.State == ConnectionState.Open)
{
cone.Close();
}
}

}
//buscar
public List<CargosBean> leeCargo()
{
List<CargosBean> lista = new List<CargosBean>();
try
{
OdbcCommand cmd = new OdbcCommand();
cmd.Connection = cone;
cmd.CommandText = "select * from cargos";
cone.Open();
OdbcDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
CargosBean bean = new CargosBean();
bean.Cod = Convert.ToInt32(reader["codigo"]);
bean.Nom = Convert.ToString(reader["descripcion"]);
lista.Add(bean);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
finally
{
if (cone.State == ConnectionState.Open)
{
cone.Close();
}
}
return lista;
}

//busca por codigo


public List<CargosBean> buscarCod(CargosBean obj)
{
List<CargosBean> buscar = new List<CargosBean>();
try
{
OdbcCommand cmd = new OdbcCommand();
cmd.Connection = cone;

Ms. Ing. Rubén Sanabria B. 38


cmd.CommandText = "select * from cargos where codigo ='"+obj.Cod+"'";
cone.Open();
OdbcDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
CargosBean bean = new CargosBean();
bean.Nom = Convert.ToString(reader["descripcion"]);
buscar.Add(bean);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
finally
{
if (cone.State == ConnectionState.Open)
{
cone.Close();
}
}
return buscar;
}

//hallar el maximo valor


public List<CargosBean> maxvalor(CargosBean obj)
{
List<CargosBean> max = new List<CargosBean>();
try
{
OdbcCommand cmd = new OdbcCommand();
cmd.Connection = cone;
cmd.CommandText = "select MAX(codigo+1) as ultimo from cargos";
cone.Open();
OdbcDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
CargosBean bean = new CargosBean();
bean.Cod = Convert.ToInt32(reader["ultimo"]);
max.Add(bean);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message.ToString());
}
finally
{
if (cone.State == ConnectionState.Open)
{
cone.Close();
}
}
return max;
}

Ms. Ing. Rubén Sanabria B. 39


}
}

EN LA CAPA VIEWS

using System;
using System.Drawing;
using System.Collections.Generic;
using System.Windows.Forms;
using sueldos1.Controladores;
using sueldos1.Modelos;
using sueldos1.Reportes;

namespace sueldos1
{

public partial class frmCargos : Form


{
CargosBean bean = new CargosBean();
CargosDAO dao = new CargosDAO();
int ban = 0;

public frmCargos()
{
InitializeComponent();

}
void FrmCargosLoad(object sender, EventArgs e)
{
leer_tabla();
}

private void leer_tabla()


{
dataGridView1.DataSource = dao.leeCargo();
}
void Button1Click(object sender, EventArgs e)
{
ban = 1;
//buscar maximo valor
List<CargosBean> maximo = new List<CargosBean>();
maximo = dao.maxvalor(bean);
if (maximo.Count>0)
{
foreach (var obj in maximo)
{
textBox1.Text = Convert.ToString(obj.Cod);
}
}
textBox2.Focus();
textBox1.Enabled = true;
}
void Button5Click(object sender, EventArgs e)
{
switch (ban){

Ms. Ing. Rubén Sanabria B. 40


case 1: {
DialogResult result = MessageBox.Show("Seguro que desea
Grabar?", "Grabar", MessageBoxButtons.YesNo);
if (result == DialogResult.Yes)
{
// bean.Cod = int.Parse(textBox1.Text);
bean.Cod = Convert.ToInt32(textBox1.Text);
bean.Nom = textBox2.Text;
dao.insertar(bean);
}
else {}
break;
}

case 3: {
DialogResult result = MessageBox.Show("Seguro que desea
Modificar?", "Sistema de Stock", MessageBoxButtons.YesNo);
if (result == DialogResult.Yes)
{
bean.Cod = int.Parse(textBox1.Text);
bean.Nom = textBox2.Text;
dao.modificar(bean);
}
else { }
break;
}
}
leer_tabla();
tabPage1.Show();

}
void Button3Click(object sender, EventArgs e)
{
ban = 3;
textBox1.Focus();
}

void TextBox1KeyPress(object sender, KeyPressEventArgs e)


{
if (e.KeyChar==Convert.ToChar(Keys.Enter))
{
//buscar
bean.Cod = int.Parse(textBox1.Text);
List<CargosBean> verCodigo = new List<CargosBean>();
verCodigo = dao.buscarCod(bean);
if (verCodigo.Count>0)
{
foreach (var obj in verCodigo)
{
textBox2.Text = obj.Nom;
}
if (ban==2)
{
DialogResult result = MessageBox.Show("Seguro que desea Borrar?",
"Sistema de Stock", MessageBoxButtons.YesNo);

Ms. Ing. Rubén Sanabria B. 41


if (result == DialogResult.Yes)
{
bean.Cod = int.Parse(textBox1.Text);
dao.eliminar(bean);
leer_tabla();
tabPage1.Show();
}
else { }
}
}
else
{
MessageBox.Show("No existen datos...");
}

}
void Button6Click(object sender, EventArgs e)
{
Close();
}
void Button2Click(object sender, EventArgs e)
{
ban = 2;
textBox1.Focus();
}

private void button4_Click(object sender, EventArgs e)


{
rptCargos rpt = new rptCargos();
rpt.Show();
}

private void button7_Click(object sender, EventArgs e)


{
bean.Nom = textBox3.Text;
this.dataGridView1.DataSource = dao.selecciona(bean);
}
}
}

Ms. Ing. Rubén Sanabria B. 42

También podría gustarte