C# (C Sharp) Mejor que JAVA???? Opinen

bueno, tratare de ir posteando lo k vaya aprendiendo en este lenguaje

les dejo un poco de teoria

“Muchos dicen que si Java se puede considerar un C++ mejorado en cuestiones de seguridad y portabilidad, C# debe entenderse como un Java mejorado en todos los sentidos: desde la eficiencia hasta la facilidad de integración con aplicaciones tan habituales como Microsoft Office o Corel Draw."



Todo esto es sobre POO (Programación Orientada a Objetos)

Programación Orientada a Objetos

La programación orientada a objetos es algo más que “el último grito en programación”. No se trata de una moda, sino de un modo de trabajo más natural, que te permite centrarte en solucionar el problema que tienes que resolver en lugar de tener que andar pensando en cómo le digo al ordenador que haga esto o lo otro. Si alguna vez utilizaste algún lenguaje de los del “año del caldo” me comprenderás enseguida. El 90% del código estaba dedicado a comunicarte con el ordenador (que si diseñar la pantalla, que si reservar memoria, que si el monitor me aguanta esta resolución...), y el otro 10% a resolver el problema. Ya no digamos si alguna vez has hecho, o intentado, algún programa para Windows usando C en bajo nivel. La programación orientada a objetos (POO en adelante) te abstrae de muchas de estas preocupaciones para que puedas dedicarte a escribir realmente el código útil, es decir, resolver el problema y ya está

bueno con eso basta hoy

PD: todo esto esta sacado de un manual que encontre en la red muy bueno



Imagina hacer un programa que mantenga una base de datos de personas. Simple y llanamente. ¿Cómo era esto antes? ¡JA! ¡JAJA! Recoge los datos, abre el archivo, define la longitud del registro, define la longitud y el tipo de cada campo, pon cada campo en su sitio, guarda el registro en el lugar del archivo donde le corresponde y cierra el archivo. Después, para una búsqueda, recoge los datos a buscar, abre el archivo, busca los datos, cierra el archivo, presenta los resultados. Si además permites modificaciones, recoge los nuevos datos, vuelve a abrir el archivo, guarda los datos modificados en el registro que le corresponde, cierra el archivo...

Pesado, ¿eh? Ciertamente. La mayor parte del tiempo la dedicábamos a comunicarnos con el ordenador. ¿Cómo sería esto con un lenguaje orientado a objetos, como C#? Mucho más sencillo. Tenemos un objeto Persona. Para agregar un registro, sencillamente habría que dar los valores a dicho objeto y decirle que los guarde. Ya está. Nos da igual cómo haga el objeto Persona para guardar. Veámoslo:

Persona.Nombre = Pepe

Persona.Apellido = Pepe (otra vez, hala)

Persona.Dirección = la dirección que sea

Persona.Guardar

y para buscar?

Persona.Buscar(Manolo)

Si lo encuentra, las propiedades Nombre, Apellido y Dirección ya se habrían rellenado con los datos del tal Manolo. ¿Cómo lo ha hecho el objeto Persona? ¡Qué más da! Esto es lo verdaderamente útil de la POO, ya que no tienes que preocuparte de cómo el objeto hace su trabajo. Si está bien construido y funciona no tienes que preocuparte de nada más, sino simplemente de usarlo según tus necesidades

Si lo piensas un poco, no se trata de un sistema arbitrario, o de una invención particular de algún iluminado

Pongamos por ejemplo que, en lugar de diseñar un programa, estás conduciendo un coche. ¿Qué esperas que suceda cuando pisas el acelerador? Pues esperas que el coche acelere, claro. Ahora bien, cómo haga el coche para decirle al motor que aumente de revoluciones te trae sin cuidado. En realidad, da igual que haya un mecanismo mecánico mediante un cable, o un mecanismo electrónico, o si debajo del capó hay un burro y al pisar el acelerador se introduce una guindilla por el sito que más le pueda escocer al desdichado animal. Además, esto nos lleva a otra gran ventaja: Por mucho que avance la tecnología, el modo de conducir un coche siempre es el mismo, ya que lo único que cambia es el mecanismo interno, no la interfaz que te ofrece. Esto mismo es aplicable a los objetos en programación: por mucho que cambien las versiones de los objetos para hacerlos más eficientes, estos siempre ofrecerán la misma interfaz, de modo que podrás seguir utilizándolos sin necesidad de hacer modificación alguna cuando aparezca una nueva versión del objeto.



Clases y Objetos

Vamos a entrar ahora en más detalles: qué son las clases, qué son los objetos y en qué se diferencian.

A menudo es fácil confundir ambos términos. ¿Ambas cosas son iguales? No, ni mucho menos, aunque están íntimamente relacionados. Para que pueda haber un objeto debe existir previamente una clase, pero no al revés. Me explico: la clase es la “plantilla” en la que nos basamos para crear el objeto. Volvamos al ejemplo del coche: todos ellos tienen una serie de características comunes: todos tienen un motor, ruedas, un volante, pedales, chasis, carrocería...; todos funcionan de un modo parecido para acelerar, frenar, meter las marchas, dar las luces...; sin embargo, cada uno de ellos es diferente de los demás, puesto que cada uno es de su marca, modelo, color, número de bastidor..., propiedades que lo diferencian de los demás, aunque una o varias de ellas puedan coincidir en varios coches. Diríamos entonces que todos los coches están basados en una plantilla, o un tipo de objeto, es decir, pertenecen todos a la misma clase: la clase coche. Sin embargo, cada uno de los coches es un objeto de esa clase: todos comparten la “interfaz”, pero no tienen por qué compartir los datos (marca, modelo, color, etc). Se dice entonces que cada uno de los objetos es una instancia de la clase a la que pertenece, es decir, un objeto. En resumen, la clase es algo genérico (la idea que todos tenemos sobre lo que es un coche) y el objeto es algo mucho más concreto (el coche del vecino, el nuestro, el papamóvil...).

Veamos cómo sería esto en C#. El diseño de la clase Coche sería algo parecido a esto (aunque más ampliado):

class Coche{

public Coche(string marca, string modelo, string color, string numbastidor){

this.Marca=marca;

this.Modelo=modelo;

this.Color=color;

this.NumBastidor=numbastidor;

}

public double Velocidad{

get{

return this.velocidad;

}

}

protected double velocidad=0;

public string Marca;

public string Modelo;

public string Color;

public string NumBastidor;

public void Acelerar(double cantidad){

// Aquí se le dice al motor que aumente las revoluciones pertinentes, y...

Console.WriteLine(“Incrementando la velocidad en {0} km/h”, cantidad);

this.velocidad += cantidad;

}

public void Girar(double cantidad){

// Aquí iría el código para girar

Console.WriteLine(“Girando el coche {0} grados”, cantidad);

}

public void Frenar(double cantidad){

// Aquí se le dice a los frenos que actúen, y...

Console.WriteLine(“Reduciendo la velocidad en {0} km/h”, cantidad);

this.velocidad -= cantidad;

}

}



Veamos una clase con un método Main para ver cómo se comportaría esta clase:

class EjemploCocheApp{

static void Main(){

Coche MiCoche=new Coche(“Peugeot”, “306”, “Azul”,”1546876”);

Console.WriteLine(“Los datos de mi coche son:”);

Console.WriteLine(“Marca: {0}”, MiCoche.Marca);

Console.WriteLine(“Modelo: {0}”, MiCoche.Modelo);

Console.WriteLine(“Color: {0}”, MiCoche.Color);

Console.WriteLine(“Número de bastidor: {0}”, MiCoche.NumBastidor);

MiCoche.Acelerar(100);

Console.WriteLine(“La velocidad actual es de {0} km/h”,MiCoche.Velocidad);

MiCoche.Frenar(75);

Console.WriteLine(“La velocidad actual es de {0} km/h”,MiCoche.Velocidad);

MiCoche.Girar(45);

}

El resultado que aparecería en la consola al ejecutar este programa sería este:

Los datos de mi coche son los siguientes:

Marca: Peugeot

Modelo: 306

Color: Azul

Número de bastidor: 1546876

Incrementando la velocidad en 100 km/h

La velocidad actual es de 100 km/h

Reduciendo la velocidad en 75 km/h

La velocidad actual es de 25 km/h

Girando el coche 45 grados

No te preocupes por no entender todo el código todavía, pues ya hablaremos largo y tendido de la sintaxis. Sólo quiero que te fijes en que en la clase es donde se definen todos los datos y se programan todas las acciones que han de manejar los objetos de esta clase. Los datos son Velocidad, Marca, Modelo, Color y NumBastidor, y los métodos son Acelerar, Girar y Frenar. Sin embargo, el objeto, MiCoche (creado en la primera línea del método Main) no define absolutamente nada. Simplemente usa la interfaz diseñada en la clase (la interfaz de una clase es el conjunto de métodos y propiedades que esta ofrece para su manejo). Por lo tanto, Coche es la clase y MiCoche un objeto de esta clase

bueno con esto acabo hoy,,

traten de entender esto :P

Los pilares de la POO: Encapsulamiento, Herencia y Polimorfismo

Qué es eso del encapsulamiento? Podríamos definirlo como la capacidad que tienen los objetos de ocultar su código al cliente y proteger sus datos, ofreciendo única y exclusivamente una interfaz que garantiza que el uso del objeto es el adecuado.

Otro de los pilares básicos de la POO es la herencia. Gracias a ella podemos definir clases nuevas basadas en clases antiguas, añadiéndoles más datos o más funcionalidad.

Ejemplo de Herencia:

class CocheAparcador:Coche{

public CocheAparcador(string marca, string modelo, string color, string numbastidor): base(marca, modelo, color, numbastidor) {}

public void Aparcar(){

// Aquí se escribe el código para que el coche aparque solo

Console.WriteLine(“Aparcando el coche de modo automático”);

this.velocidad = 0;

}

}

¿Qué ha pasado? ¿Dónde están todos los demás miembros de la clase? Aunque parezca mentira, están. La clase CocheAparcador ha heredado todos los miembros de su clase base (Coche). Lo único que ha añadido ha sido el método Aparcar, de modo que cualquier objeto de la clase CocheAparcador (ojo, no de la clase Coche) tendrá todos los miembros de la clase Coche más el método Aparcar incorporado en la clase derivada CocheAparcador. ¿Y cómo se instancian objetos de una clase derivada? Pues exactamente igual que si se instanciara de cualquier otra clase.

Veámoslo con el ejemplo anterior, modificando ligeramente el método Main:

class EjemploCocheApp{

static void Main(){

CocheAparcador MiCoche=new CocheAparcador(“Peugeot”, “306”, “Azul”,”1546876”);

Console.WriteLine(“Los datos de mi coche son:”);

Console.WriteLine(“Marca: {0}”, MiCoche.Marca);

Console.WriteLine(“Modelo: {0}”, MiCoche.Modelo);

Console.WriteLine(“Color: {0}”, MiCoche.Color);

Console.WriteLine(“Número de bastidor: {0}”, MiCoche.NumBastidor);

MiCoche.Acelerar(100);

Console.WriteLine(“La velocidad actual es de {0} km/h”,MiCoche.Velocidad);

MiCoche.Frenar(75);

Console.WriteLine(“La velocidad actual es de {0} km/h”,MiCoche.Velocidad);

MiCoche.Girar(45);

MiCoche.Aparcar();

string a=Console.ReadLine();

}

}



Ahora, el resultado en la consola sería este:

Los datos de mi coche son los siguientes:

Marca: Peugeot

Modelo: 306

Color: Azul

Número de bastidor: 1546876

Incrementando la velocidad en 100 km/h

La velocidad actual es de 100 km/h

Reduciendo la velocidad en 75 km/h

La velocidad actual es de 25 km/h

Girando el coche 45 grados

Aparcando el coche de modo automático

Ahora, el objeto MiCoche tiene los mismos miembros que tenía cuando era de la clase Coche más el método Aparcar implementado por la clase derivada CocheAparcador.

Y entonces, ¿podría construir clases más complejas a partir de otras clases más sencillas? Hombre, este es el objetivo principal de la herencia. No obstante, C# soporta la herencia simple, pero no la herencia múltiple. Por lo tanto, en C# podemos construir una clase derivada a partir de otra clase, pero no de varias clases. Sobre este aspecto, lo ideal para construir una clase coche hubiera sido construir clases más sencillas (ruedas, motor, chasis, carrocería, volante, ...), y después construir la clase coche derivándola de todas ellas:

class Coche:Ruedas, Motor, Chasis, Carrocería, Volante //Error. C# no soporta herencia múltiple

Sin embargo ya digo que esto no es posible en C#. Una clase puede derivarse de otra, pero no de varias. Sí se puede derivar una clase de otra clase y varias interfaces,  pero en esto aun no nos metemos.

Polimorfismo

es otra de las maravillas que incorpora la POO. ¿Qué ocurre si, siguiendo con el manido ejemplo de los coches, cada coche ha de comportarse de un modo diferente dependiendo de su marca, esto es, si es un Peugeot, por ejemplo, el acelerador acciona un cable, pero si es un Volkswagen, el acelerador acciona un mecanismo electrónico?. Bien, alguien acostumbrado a la programación procedimental dirá: “Eso está regalado. Basta con un Switch”, Chekemos:

class Coche{

public Coche(string marca, string modelo, string color, string numbastidor){

this.Marca=marca;

this.Modelo=modelo;

this.Color=color;

this.NumBastidor=numbastidor;

}

public double Velocidad{

get{

return this.velocidad;

}

}

protected double velocidad=0;

public string Marca;

public string Modelo;

public string Color;

public string NumBastidor;

public void Acelerar(double cantidad){

switch this.Marca{

case “Peugeot”:

// Aquí acciona el mecanismo de aceleración de los Peugeot...

Console.WriteLine(“Accionando el mecanismo de aceleración del Peugeot”);

break;

case “Volkswagen”:

// Aquí acciona el mecanismo de aceleración de los Volkswagen...

Console.WriteLine(“Accionando el mecanismo de aceleración del Volkswagen”);

break;

case “Seat”:

// Aquí acciona el mecanismo de aceleración de los Seat...

Console.WriteLine(“Accionando el mecanismo de aceleración del Seat”);

break;

default:

// Aquí acciona el mecanismo de aceleración por defecto...

Console.WriteLine(“Accionando el mecanismo de aceleración por defecto”);

break;

}

Console.WriteLine(“Incrementando la velocidad en {0} km/h”);

this.velocidad += cantidad;

}

public void Acelerar(double cantidad){

// Aquí se le dice al motor que aumente las revoluciones pertinentes, y...

Console.WriteLine(“Incrementando la velocidad en {0} km/h”, cantidad);

this.velocidad += cantidad;

}

public void Girar(double cantidad){

// Aquí iría el código para girar

Console.WriteLine(“Girando el coche {0} grados”, cantidad);

}

public void Frenar(double cantidad){

// Aquí se le dice a los frenos que actúen, y...

Console.WriteLine(“Reduciendo la velocidad en {0} km/h”, cantidad);

this.velocidad -= cantidad;

}

}

Perfecto, ¿Y si aparece una marca nueva con un mecanismo diferente? -"Estoooo, bueno... pueees... se añade al switch y ya está."- ¡Buena respuesta! Entonces, habría que buscar el código fuente de la clase Coche, y hacer las modificaciones oportunas, ¿no? -"Pues sí, claro- Bien"

Imagínate ahora que la clase Coche no es una clase en programación, sino una clase de verdad, o sea, coches de verdad. Si se crea un nuevo sistema de aceleración, ¿tienen que buscar el manual de reparación del coche, modificarlo para contemplar el nuevo sistema y después redistribuirlo otra vez todo entero a todo el mundo? Claro que no. Lo que se hace es, simplemente, escribir un nuevo manual únicamente con las innovaciones y distribuir esta parte a aquellos que lo vayan a necesitar para que se añada a lo que ya existe, ni más ni menos. Pues esto es, más o menos, lo que proporciona el polimorfismo en la POO. No es necesario modificar el código de la clase original. Si esta está bien diseñada, basta con derivar otra clase de la original y modificar el comportamiento de los métodos necesarios.

Claro, para esto la clase Coche debería estar bien construida. Algo como esto:

class Coche{

public Coche(string marca, string modelo, string color, string numbastidor){

this.Marca=marca;

this.Modelo=modelo;

this.Color=color;

this.NumBastidor=numbastidor;

}

public double Velocidad{

get{

return this.velocidad;

}

}

protected double velocidad=0;

public string Marca;

public string Modelo;

public string Color;

public string NumBastidor;

public virtual void Acelerar(double cantidad){

// Aquí se le dice al motor que aumente las revoluciones pertinentes, y...

Console.WriteLine(“Accionando el mecanismo de aceleración por defecto”);

Console.WriteLine(“Incrementando la velocidad en {0} km/h”, cantidad);

this.velocidad += cantidad;

}

public virtual void Girar(double cantidad){

// Aquí iría el código para girar

Console.WriteLine(“Girando el coche {0} grados”, cantidad);

}

public virtual void Frenar(double cantidad){

// Aquí se le dice a los frenos que actúen, y...

Console.WriteLine(“Reduciendo la velocidad en {0} km/h”, cantidad);

this.velocidad -= cantidad;

}

}

Fíjate un poquito en los cambios con respecto a la que habíamos escrito en primer lugar: se ha añadido la palabra virtual en las declaraciones de los tres métodos. ¿Para qué? Para que las clases derivadas puedan sobrescribir el código de dichos métodos en caso de que alguna de ellas lo necesite porque haya cambiado el mecanismo.

Fíjate bien en cómo lo haría una clase que sobrescribe el método Acelerar porque utiliza un sistema distinto al de la clase Coche:

class CocheAceleradorAvanzado:Coche{

public CocheAceleradorAvanzado(string marca, string modelo, string color, string numbastidor): base(marca, modelo, color, numbastidor) {}

public override void Acelerar(double cantidad){

// Aquí se escribe el nuevo mecanismo de aceleración

Console.WriteLine(“Accionando el mecanismo avanzado de aceleración”);

Console.WriteLine(“Incrementando la velocidad en {0} km/h”, cantidad);

this.velocidad += cantidad;

}

}

Ya está. La clase base queda intacta, es decir, no hay que modificar absolutamente nada. La clase derivada únicamente sobrescribe aquello que no le sirve de la clase base, que es en este caso el método acelerar. Fíjate que para poder hacerlo hemos puesto la palabra override en la declaración del método. Pero puede que alguno piense: “Vamos a ver si yo me aclaro. En ese caso, en la clase derivada habría dos métodos Acelerar: uno el derivado y otro el sobrescrito que, además, tienen los mismos argumentos. ¿Cómo sabrá el compilador cuál de ellos ha de ejecutar?” El compilador siempre ejecuta el método sobrescrito si el objeto pertenece a la clase derivada que lo sobrescribe. Es como si eliminara completamente el método virtual de la clase derivada, sustituyéndolo por el nuevo.

Veamos un ejemplo:

CocheAceleradorAvanzado MiCoche;

...

MiCoche = new CocheAceleradorAvanzado(“Peugeot”, “306”, “Azul”, “54668742635”);

MiCoche.Acelerar(100);

En este caso, está muy claro. El objeto MiCoche está declarado como un objeto de la clase CocheAceleradorAvanzado, de modo que al ejecutar el método acelerar se ejecutará sin problemas el método de la clase derivada. Por lo tanto, la salida por pantalla de este fragmento sería:

Accionando el mecanismo avanzado de aceleración

Incrementando la velocidad en 100 km/h

Sin embargo, este otro ejemplo puede ser más confuso:

Coche MiCoche;

...

MiCoche = new CocheAceleradorAvanzado(“Peugeot”, “306”, “Azul”, “54668742635”);

MiCoche.Acelerar(100);

Un momento, un momento. Aquí el objeto MiCoche está declarado como un objeto de la clase Coche y, sin embargo, se instancia como objeto de la clase CocheAceleradorAvanzado. ¿Cuál de los dos métodos ejecutará ahora? De nuevo ejecutará el método de la clase derivada, como en el caso anterior. ¿Entonces, para qué diantres has declarado el objeto MiCoche como un objeto de la clase Coche? Sencillo: pudiera ser que yo sepa que voy a necesitar un objeto que será un coche, pero en el momento de declararlo no sé si será un coche normal o uno de acelerador avanzado. Por este motivo, tengo que declararlo como objeto de la clase Coche. Sin embargo, más adelante sabré qué tipo de coche tengo que crear, por lo que instanciaré el que necesite. Gracias al polimorfismo no tendré que preocuparme de decirle que ejecute un método u otro, ya que el compilador ejecutará siempre el que le corresponda según la clase a la que pertenezca. La salida por pantalla en este caso sería, por lo tanto, exactamente la misma que en el caso anterior.

El polimorfismo, en resumen, ofrece la posibilidad de que varios objetos que comparten la misma interfaz, es decir, que están formados por los mismos miembros, se comporten de un modo distinto unos de otros.

NOTA:dado que en C# todo, hasta los tipos de datos de toda la vida, son objetos (bueno, todo, lo que se dice todo, no: los punteros no son objetos).

Bueno, se k es un poco largo, pero en cuestión de conceptos es todo,, ahora viene lo entretenido, el mundo .NET jejeje

;)

Bueno, como aun keda un largo camino por entender este lenguaje, no kiero llenar el post de puros conceptos, asi k aki les dejo el manual, les aclaro, este mismo no es mio, lo encontre en la red, no recuerdo el autor pero aki se los dejo :P

http://www.megaupload.com/?d=9E4ZM2A0

cualkier duda, preguntan y si lo se, respondo littles girls

2 comentarios:

  1. Excelente estaremos al tanto de las practicas ;)

    ResponderEliminar
  2. ahi esta link del manual, para k los descarguen saz es todo

    ResponderEliminar