0% encontró este documento útil (0 votos)
30 vistas31 páginas

Programación en C#: Herencia e Interfaces

Cargado por

Diana Gutierrez
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 PPTX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
30 vistas31 páginas

Programación en C#: Herencia e Interfaces

Cargado por

Diana Gutierrez
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 PPTX, PDF, TXT o lee en línea desde Scribd

Conceptos Generales de la programación en C#

UNIDAD III: Lenguaje de


Programación C# y .NET
Contenido
4.6 Cuadro de diálogos en WPF
4.7 Casillas de verificación en WPF
4.8 Listas Simples en WPF
4.9 Listas desplegables en WPF

UNI/IES-DGS-IIC2022 1
Conceptos Generales de la programación en C#
3.10 Colecciones y genéricos
La herencia es uno de los atributos fundamentales de la programación orientada a
objetos. Permite definir una clase secundaria que reutiliza (hereda), amplía o modifica el
comportamiento de una clase primaria. La clase cuyos miembros son heredados se
conoce como clase base. La clase que hereda los miembros de la clase base se conoce
como clase derivada.

C# y .NET solo admiten herencia única. Es decir, una clase solo puede heredar de una
clase única. Sin embargo, la herencia es transitiva, lo que le permite definir una jerarquía
de herencia para un conjunto de tipos. En otras palabras, el tipo D puede heredar del tipo
C, que hereda del tipo B, que hereda del tipo de clase base A. Dado que la herencia es
transitiva, los miembros de tipo A están disponibles para el tipo D.

UNI/IES-DGS-IIC2022 2
Conceptos Generales de la programación en C#
No todos los miembros de una clase base los heredan las clases derivadas. Los siguientes
miembros no se heredan:
Constructores estáticos, que inicializan los datos estáticos de una clase.
Constructores de instancias, a los que se llama para crear una nueva instancia de la clase.
Cada clase debe definir sus propios constructores.
Finalizadores, llamados por el recolector de elementos no utilizados en tiempo de ejecución
para destruir instancias de una clase.
Si bien las clases derivadas heredan todos los demás miembros de una clase base, que
dichos miembros estén o no visibles depende de su accesibilidad. La accesibilidad del
miembro afecta a su visibilidad en las clases derivadas del modo siguiente:

UNI/IES-DGS-IIC2022 3
Conceptos Generales de la programación en C#
Los miembros privados solo son visible en las clases derivadas que están anidadas en su clase
base. De lo contrario, no son visibles en las clases derivadas. En el ejemplo siguiente, A.B es
una clase anidada que se deriva de A, y C se deriva de A. El campo privado A._value es visible
en A.B. Pero si quita los comentarios del método C.GetValue e intenta compilar el ejemplo, se
produce el error del compilador CS0122: "'A._value' no es accesible debido a su nivel de
protección".

public class A { public class C : A {


private int _value = 10; // public int
public class B : A GetValue()
{ // {
public int GetValue() // return _value;
{ // }
return _value; }
}
}
}
UNI/IES-DGS-IIC2022 4
Conceptos Generales de la programación en C#
public class AccessExample {
public static void Main(string[] args) {
var b = new A.B();
Console.WriteLine(b.GetValue());
}
}
// The example displays the following output:
// 10

Los miembros protegidos solo son visibles en las clases derivadas.

Los miembros internos solo son visibles en las clases derivadas que se encuentran en el mismo
ensamblado que la clase base. No son visibles en las clases derivadas ubicadas en un
ensamblado diferente al de la clase base.
UNI/IES-DGS-IIC2022 5
Conceptos Generales de la programación en C#
Los miembros públicos son visibles en las clases derivadas y forman parte de la interfaz
pública de dichas clases. Los miembros públicos heredados se pueden llamar como si se
definieran en la clase derivada. En el ejemplo siguiente, la clase A define un método
denominado Method1 y la clase B hereda de la clase A. El ejemplo llama a Method1 como
si fuera un método de instancia en B.

public class A public class Example


{ {
public void Method1() public static void Main()
{ {
// Method implementation. B b = new ();
} b.Method1();
} }
}
public class B : A
{ }

UNI/IES-DGS-IIC2022 6
Conceptos Generales de la programación en C#
3.8.4 Interfaces
Las interfaces son una abstracción que nos ofrecen la mayor parte de los lenguajes de
programación orientados a objetos. Básicamente nos permiten definir un "contrato" sobre el
que podemos estar seguros de que, las clases que las implementen, lo van a cumplir.
Por ejemplo, podemos definir una interfaz muy simple de esta manera que nos servirá para
crear clases que representen a cualquier tipo de contenedor:
class Contenedor
{
public int Quitar();
public void Meter(int v);
private bool EstaRepetido(int v);
}

UNI/IES-DGS-IIC2022 7
Conceptos Generales de la programación en C#
De este modo estamos diciendo que si una clase la implementa tiene necesariamente que
tener un método llamado Quitar con la firma del que hemos puesto ahí, es decir, que
devolverá un dato de tipo entero.

Su interfaz está formada por los métodos Quitar y Meter. El método EstaRepetido no forma
parte de la interfaz de dicha clase, ya que es privado.

En orientación a objetos decimos que la interfaz de una clase define el comportamiento de


dicha clase, ya que define que podemos y que no podemos hacer con objetos de dicha clase:
dado un objeto de la clase Contenedor yo puedo llamar al método Quitar y al métdo Meter
pero no puedo llamar al método EstaRepetido.

UNI/IES-DGS-IIC2022 8
Conceptos Generales de la programación en C#
Así pues: toda clase tiene una interfaz que define que podemos hacer con los objetos de
dicha clase.

Interfaces idénticas no significa clases intercambiables

Fíjate en estas dos clases:


class Contenedor {
public int Quitar() { ... }
public void Meter (int v) { ... }
}
class OtroContenedor
{
public int Quitar() { ... }
public void Meter (int v) { ... }
}
UNI/IES-DGS-IIC2022 9
Conceptos Generales de la programación en C#
Para estos ejemplos, podemos decir que su interfaz es la misma: con ambas clases podemos
hacer lo mismo: llamar al método Quitar y al método Meter.

Ahora pensemos que en cualquier otro sitio tenemos un método definido tal y como sigue:
public void foo (Contenedor c)
{
// Hacer cosas con c como p.ej:
int i = c.Quitar();
c.Meter(10);
}

El método recibe un Contenedor y opera con él. Ahora dado que las interfaces de Contenedor
y OtroContenedor son iguales, uno podría esperar que lo siguiente funcionase:

UNI/IES-DGS-IIC2022 10
Conceptos Generales de la programación en C#
OtroContenedor oc = new OtroContenedor();
foo(oc);

Pero esto no va a compilar. Porque aunque nosotros somos capaces leyendo el código de
comparar la interfaz de ambas clases, el compilador no puede hacer esto. Para el compilador
Contenedor y OtroContenedor son dos clases totalmente distintas sin ninguna relación. Por lo
tanto un método que espera un Contenedor no puede aceptar un objeto de la clase
OtroContenedor.

UNI/IES-DGS-IIC2022 11
Conceptos Generales de la programación en C#
Implementación de interfaces
El ejemplo anterior ejemplifica un caso muy común: tener dos clases que hacen lo mismo pero
de diferente manera. P.ej. imagina que Contenedor está implementado usando un array en
memoria y OtroContenedor está implementando usando otro tipo de estructura, puede ser un
fichero en disco. La funcionalidad (la interfaz) es la misma, lo que varía es la implementación.
Es por ello que en programación orientada a objetos decimos que las interfaces son
funcionalidades (o comportamientos) y las clases representen implementaciones.
Ahora bien, si dos clases representan dos implementaciones distintas de la misma funcionalidad,
las podemos intercambiar. Para que dicho intercambio sea posible C# (y en general cualquier
lenguaje orientado a objetos) permite explicitar la interfaz, es decir separar la declaración de la
interfaz de su implementación (de su clase). Para ello usamos la palabra clave interface:

UNI/IES-DGS-IIC2022 12
Conceptos Generales de la programación en C#
interface IContenedor
{
int Quitar();
void Meter(int i);
}

Este código declara una interfaz IContenedor que declara los métodos Quitar y Meter. Se
puede notar que estos métodos no se declaran como public (en una interfaz la visibilidad no
tiene sentido, ya que todo es public) y que no se implementan los métodos.

Las interfaces son un concepto más teórico que real. No se pueden crear interfaces.

UNI/IES-DGS-IIC2022 13
Conceptos Generales de la programación en C#
podemos indicar explícitamente que una clase implementa una interfaz, es decir proporciona
implementación (código) a todos y cada uno de los métodos (y propiedades) declarados en la
interfaz:

class Contenedor : IContenedor


{
public int Quitar() { ... }
public void Meter(int i) { ... }
}

La clase Contenedor declara explícitamente que implementa la interfaz IContenedor. Así pues
la clase debe proporcionar implementación para todos los métodos de la interfaz.

UNI/IES-DGS-IIC2022 14
Conceptos Generales de la programación en C#
Cuando usar interfaces?

En general siempre que tengas, o preveas que puedes tener más de una clase para hacer lo
mismo: usa interfaces. Es mejor pecar de exceso que de defecto en este caso. No te preocupes
por penalizaciones de rendimiento en tu aplicación porque no las hay.´

No digo que toda clase deba implementar una interfaz obligatoriamente, muchas clases
internas no lo implementarán, pero en el caso de las clases públicas (visibles desde el
exterior) deberías pensarlo bien. Además pensar en la interfaz antes que en la clase en sí, es
pensar en lo que debe hacerse en lugar de pensar en como debe hacerse.

UNI/IES-DGS-IIC2022 15
Conceptos Generales de la programación en C#
3.8.5 Polimorfismo

 Es la habilidad que poseen los objetos parareaccionar de modo diferente ante los
mismosmensajes.
 lpolimorfismose refiere a la posibilidad de definirmúltiples clases con funcionalidad
diferente, perocon métodos o propiedades denominados de formaidéntica, que pueden
utilizarse de maneraintercambiable mediante código cliente en tiempode ejecución.
 En C# el polimorfismo está íntimamenterelacionado con la sobrecarga y métodos
virtuales

UNI/IES-DGS-IIC2022 16
Conceptos Generales de la programación en C#
3.9 Flujos de entrada / Salida
Flujos de entrada y salida en .NET
Todos los programas de computadora hacen uso de dispositivos de entrada y salida, los más
clásicos para estos fines son el teclado (entrada estándar) y la consola salida (salida estándar).
.NET hace una abstracción de cada uno de estos dispositivos con el modelo de flujos (bajo el
(concepto) de flujo), haciendo la analogía como si se tratase de una corriente de agua, solo que
para el caso de las aplicaciones .NET se trata de corrientes de bytes. En resumen la
comunicación entre .NET y el hardware de la computadora se realiza mediante el concepto de
flujos.
La clase base para el tratamiento de estos flujos es la clase Stream, de la cuál derivan los flujos
necesarios para la comunicación de los programas hacia el respaldo (persistencia) o en
términos de .NET el Backing Store. .NET a diferencia de Java utiliza la misma clase para los
flujos de entrada como para los de salida. A continuación la lista de los flujos básicos de
entrada/salida:

UNI/IES-DGS-IIC2022 17
Conceptos Generales de la programación en C#
FileStream: hacia archivos de disco
MemoryStream: hacia estructuras de memoria
NetworkStream: hacia conexiones de red

 Fichero físico: el fichero que existe realmente sobre algún soporte físico.
 Fichero lógico: identificador dentro de nuestro programa que nos permite acceder a uno
o varios archivos físicos. De igual forma un fichero físico puede asociarse con varios
ficheros lógicos.
 Registro: bloque de datos que forma un todo. Cada uno de esos datos se le llama campo.
 Acceso secuencial: cuando tenemos que recorrer todo el fichero hasta llegar a cierto
punto.
 Acceso aleatorio: podemos acceder a cualquier parte del fichero sin necesidad de
recorrer todo.

UNI/IES-DGS-IIC2022 18
Conceptos Generales de la programación en C#
El uso de archivos y su manipulación.
Un archivo, puede ser manipulado, puede abrirse, cerrarse, eliminarse, modificarse, leerse,
escribirse, etc. El proceso que se debe seguir para la manipulación de archivos es el
siguiente:

 Abrir el archivo: Tanto para leer, para escribir o modificar un archivo, éste debe abrirse.
 Manipular el archivo: En esta fase, se lee, se escribe o se modifica el contenido del
archivo.
 Cerrar el archivo: Una vez finalizada la modificación del archivo, se debe cerrar y
guardar el archivo correspondiente.

UNI/IES-DGS-IIC2022 19
Conceptos Generales de la programación en C#
Como manejamos los archivos en C#.
Para poder realizar operaciones con archivos y poder utilizarlos debemos importar una
librería específica.

Cuando programamos, todo programa debe estar dentro de al menos una clase. Dentro de
esta clase, tenemos un espacio de nombres o namespace. En este espacio de nombres
importaremos todas las clases necesarias para la entrada y salida de datos.

Estas clases se encuentran dentro del espacio de nombres System.IO. Estas siglas IO
significan In Out. Dentro de este espacio de nombre podemos encontrar multitud de clases
y métodos para la manipulación de archivos y carpetas, en este caso, vamos a ver solo
aquellas que vamos a necesitar.

UNI/IES-DGS-IIC2022 20
Conceptos Generales de la programación en C#
System.IO: Clases y objetos para el manejo de archivos.

StreamWritter: Es un objeto que permite poder escribir datos dentro de un archivo. Este
objeto crea una clase llamada TextWritter.

StreamReader: Es un objeto que permite poder leer datos de un archivo. Este objeto crea
una clase llamada TextReader.

File: Es una clase del espacio de nombres System.IO. Esta clase posee en su interior
diferentes métodos para crear, copiar, pegar, eliminar, mover y abrir archivos.

Ejemplos de manejo de archivos en C#.


En este primer ejemplo veremos como escribir en un archivo txt.

UNI/IES-DGS-IIC2022 21
Conceptos Generales de la programación en C#
sing System;
using System.IO; // Importamos la clase para manejar archivos
namespace Operaciones_con_Archivos {
class Program
{
static void Main(string[] args)
{
// Creamos o abrimos el archivo:
// Para ello creamos un nuevo objeto StreamWritter
// al cual llamamos miEscritura. Con CreateText le,
// decimos que queremos escribir texto en UFT-8. Le
// passaamos por parámetro en nombre del archivo donde
// queremos escribir, si no existe lo va a crear.
// Si existe, directamente lo abre. Si crea el archivo
// lo va a hacer dentro de la carpeta debug del directorio bin
StreamWriter miEscritura = File.CreateText("ejemplo.txt");

UNI/IES-DGS-IIC2022 22
Conceptos Generales de la programación en C#
// Escribimos en el archivo. El tipo de objeto Streamwritter
// tiene una clase llamada Write y otra llamada WriteLine.
// Para escribir en el archivo solo tenemos que hacer uso
// del objeto creado anteriormente llamado miEscritura
miEscritura.WriteLine("Esta frase se escribe en el archivo.");

// Cerramos el archivo. Al cerrarlo, se guardará en la carpeta


// debug del directorio bin.
miEscritura.Close();
}
}
}

De esta forma hemos escrito en un archivo y al cerrarlo, se guarda y se cierra perfectamente.

UNI/IES-DGS-IIC2022 23
Conceptos Generales de la programación en C#
En este caso tenemos un pequeño inconveniente con el código anterior, si queremos seguir
agregando datos, estos se sobrescribirán. Imaginemos que en un archivo tenemos 100
líneas y al actualizarlo lo actualizamos con dos líneas más. El archivo se abriría y se
actualizaría. Se guardarían las dos ultimas líneas pero desaparecerían las 100 anteriores.

¿Cómo guardar datos en un archivo sin perder los anteriores?


Esto lo haremos de la misma manera que en el código anterior, la diferencia es que en lugar
de usar el método CreateText, usaremos el método AppendText. Este método escribirá
en un archivo conservando lo anterior.

Probemos el siguiente ejemplo:

UNI/IES-DGS-IIC2022 24
Conceptos Generales de la programación en C#
using System;
using System.IO; // Importamos la clase para manejar archivos
namespace Operaciones_con_Matrices
{
class Program
{
static void Main(string[] args)
{
// Creamos una variable para almacenar nombre y edad.
string nombre = "";
byte edad = 0;

// Pedimos datos al usuario


Console.WriteLine("Inroduce tu nombre");
nombre = Console.ReadLine();
Console.WriteLine("Introduce tu edad:");
edad = byte.Parse(Console.ReadLine());
UNI/IES-DGS-IIC2022 25
Conceptos Generales de la programación en C#
// Creamos o abrimos el archivo:
StreamWriter miEscritura = File.AppendText("ejemplo.txt");

// Escribimos en el archivo. Cada vez que se ejecute


// esta aplicación, pedirá los datos y guardará los datos
// en el archivo llamado ejemplo.txt pero conservando los
// datos de usuario anteriores.
miEscritura.WriteLine("Nombre: " + nombre + "," + "Edad: " +
edad);

// Cerramos el archivo. Al cerrarlo, se guardará en la carpeta


// debug del directorio bin.
miEscritura.Close();
}
}
}

UNI/IES-DGS-IIC2022 26
Conceptos Generales de la programación en C#
Como leer archivos en CSharp
Para escribir en archivos, hemos hecho uso del objeto StreamWritter. En este caso como lo
que queremos es leer el archivo, haremos uso del objeto StreamReader. Vamos a ver un
ejemplo.

using System.IO; // Importamos la clase para manejar archivos


namespace Operaciones_con_Archivos
{
class Program
{
static void Main(string[] args)
{
// Creamos una variable para almacenar la cadena a leer
string lineaLeida = "";

// Como estamos leyendo el archivo ya tiene que existir.


// Pero, ¿y si no existe? Entonces nos dará un error. Por
UNI/IES-DGS-IIC2022 27
Conceptos Generales de la programación en C#
// lo tanto debemos envolver nuestro código en un bloque
// que nos permita controlar errores. Así que nuestro código
// lo meteremos en un bloque try - catch.

try
{
// Creamos un objeto para leer el archivo.
StreamReader miLectura = File.OpenText("ejemplo.txt");
// Leemos la primera linea del archivo.
lineaLeida = miLectura.ReadLine();

// Un archivo puede tener tantas líneas como sea


// necesario pero hasta este punto solo nos va a leer
// la primera linea y se va a quedar ahí....
// ¿Como leemos el resto del archivo? Pues creamos
// un bucle While de la siguiente manera.

UNI/IES-DGS-IIC2022 28
Conceptos Generales de la programación en C#
// Mientras la linea leida
//sea diferente de una cadena nula
while (lineaLeida != null)
{
// La podemos mostrar por consola.
Console.WriteLine(lineaLeida);

// Una vez leida y mostrada en consola


// volvemos a hacer una lectura.
miLectura.ReadLine();
}

// Cerramos el archivo
miLectura.Close();

UNI/IES-DGS-IIC2022 29
Conceptos Generales de la programación en C#
catch (Exception msg) // Si no se puede leer
mostramos el error
{
Console.WriteLine("No se encuentra el archivo " + msg);
}

// Paudamos la consola
Console.ReadKey();
}
}
}

UNI/IES-DGS-IIC2022 30
Conceptos Generales de la programación en C#

FIN
GRACIAS POR SU ATENCION

UNI/IES-DGS-IIC2022 31

También podría gustarte