namespaces y c#
TRANSCRIPT
Introducción
• “Namespaces” o “nombres de espacios” son un concepto relativamente nuevo en los lenguajes de cómputo.
• A pesar de esto, son elementos muy útiles y en algunos casos, son esenciales en la programación.
2Mtl. Lourdes Cahuich
Introducción (cont.)
• Uno de los principales problemas en la programación es la sobre-posición de nombres.
• Podemos crear muchas clases para nuestro programa, y después decidir que importaremos la biblioteca de alguien más para ayudarnos con el programa.
3Mtl. Lourdes Cahuich
Introducción (cont.)
• ¿Qué pasa si algunas de las clases de la otra persona se llaman igual a algunas de nuestras clases, pero realizan cosas diferentes?
• Aunque no lo parezca, esto sucede con mucha frecuencia.
4Mtl. Lourdes Cahuich
• Podemos imaginar que “namespace” es similar a una ciudad.
• Si le comentamos a alguien que vivimos en la calle “principal”, no le estamos dando mucha información, ya que existen muchas calles con el mismo nombre, en diferentes ciudades.
• Para ubicar exactamente la calle, debemos incluir la ciudad en la que vivimos
5Mtl. Lourdes Cahuich
• Podemos hacer una analogía entre el “namespace” y el nombre de la ciudad y la calle en la que “colocamos” cierta clase, para así poder segmentar nuestro programa.
6Mtl. Lourdes Cahuich
• Se puede poner casi cualquier cosa dentro de un “namespace”, e incluso anidarlos entre sí.
namespace System namespace Chapter04
namespaceSystem.Data
namespaceSystem.Coleccion
claseSystem.Consola
claseChapter04.Spaceship
claseChapter04.Spacesstation
7Mtl. Lourdes Cahuich
• Los “namespace” anidados permiten crear jerarquías, como que México existe dentro del continente Americano, la Ciudad de México existe dentro de México, la colonia del Valle existe dentro de la ciudad de México.
8Mtl. Lourdes Cahuich
Creando “namespaces”
namespace Chapter04{class Spaceship{//código de la clase
}class Spacestation{//código de la clase
}}
9Mtl. Lourdes Cahuich
• Afuera del namespace, accederíamos a la clase, así:
Chapter04.Spaceship s = new Chapter04.Spaceship();
• Otra cosa interesante es que podemos tener fragmentado un namespace en diferentes archivos
10Mtl. Lourdes Cahuich
• En un archivo podemos tener:
namespace Chapter04{class Spaceship{//código de la clase
}}• Y en otro archivo tener:
namespace Chapter04{class Spacestation{//código de la clase
}}• El compilador de C# automáticamente une los namespaces, así que no se
tiene que poner todo en un archivo enorme
11Mtl. Lourdes Cahuich
Usando los namespaces
• Cuando nos encontramos dentro de un namespace, podemos usar cualquier cosa que se encuentre en ellos sin tener que calificarlos.
• Pero si nos encontramos fuera del namespace, se debe calificar lo que usemos de éste, escribiendo primero el nombre del namespace, seguido de un punto y después lo que queremos usar de dicho namespace.
12Mtl. Lourdes Cahuich
• Sin embargo, si sólo usaremos elementos de un solo namespace, podemos usar la palabra reservada using para evitar tener que calificar cada elemento que usemos de dicho namespace
//al inicio del archivo de código
using Chapter04;
//después en el código
Spaceship s = new Spaceship();
13Mtl. Lourdes Cahuich
Alias de namespace
• Los namespace anidados pueden ser un problema, sin embargo se puede poner un alias para acortar el uso de namespacesanidados
using D3D = Microsoft.DirectX.Direct3D;
14Mtl. Lourdes Cahuich
Actividad práctica 10
• Tomaremos el proyecto de herencia múltiple, que programamos en un solo archivo de clase, y lo separaremos en dos archivos diferentes, pero que tengan el mismo namespace
• De manera que, aunque hagamos este cambio en el código de la clase, no tendremos que modificar el código fuente principal del proyecto.
15Mtl. Lourdes Cahuich
namespace Herencia_2p{
public class B{ //propiedades
private int p_b; //miembro privado clase baseprotected int m_b; //miembro protegido clase basepublic int k_b; //miembro público clase base//métodospublic int cuadrado() { return k_b * k_b; } //propiedad públicapublic int producto() { return k_b * m_b; } //propiedad protegidapublic int otroProducto() { return p_b*k_b; } //funcion propiedad privada//setters/getterspublic void escribeP(int num){ p_b = num; }public void escribeM(int num) { m_b = num; }
} //Fin clase B (Base)
public class D : B //Herencia sencilla{ //propiedades de clase derivada
public int n_d;//métodospublic void setvalueBase(int a) { m_b = a; }public void setvalueN(int a) { n_d = a; }public int prodNporM() { return n_d * m_b; }
} //Fin clase D (Derivada)
public class C : D{
public int c_c=5;public int productoDeTodos(){
return (k_b * n_d * c_c); //m clase abuelo, n clase padre, cc clase nieta}
}} 17Mtl. Lourdes Cahuich
Agregamos un nuevo archivo de clase
• Y en el nuevo archivo ponemos lo siguiente:
namespace Herencia_2p{
public class D : B //Herencia sencilla{ //propiedades de clase derivada
public int n_d;//métodospublic void setvalueBase(int a) { m_b = a; }public void setvalueN(int a) { n_d = a; }public int prodNporM() { return n_d * m_b; }
} //Fin clase D (Derivada)
public class C : D{
public int c_c = 5;public int productoDeTodos(){
return (k_b * n_d * c_c); //m clase abuelo, n clase padre, cc clase nieta}
}}
18Mtl. Lourdes Cahuich
En el archivo de clase original sólo queda:
namespace Herencia_2p{
public class B{ //propiedades
private int p_b; //miembro privado clase baseprotected int m_b; //miembro protegido clase basepublic int k_b; //miembro público clase base//métodospublic int cuadrado() { return k_b * k_b; } //propiedad públicapublic int producto() { return k_b * m_b; } //propiedad
protegidapublic int otroProducto() { return p_b*k_b; } //funcion
propiedad privada//setters/getterspublic void escribeP(int num){ p_b = num; }public void escribeM(int num) { m_b = num; }
} //Fin clase B (Base)} 19Mtl. Lourdes Cahuich