viernes, 16 de abril de 2010

Investigar

¿Que es ...?
progamacion orientada a objetos

La POO es un paradigma de programación que intenta abstraer los módulos de cada programa en objetos. Los objetos son instancias de clases, en las que se declaran/especifican al menos dos cosas: los atributos, los métodos y opcionalmente los constructores.

Los atributos son las variables que posee el objeto, mientras que los métodos son las funciones o procedimientos que podemos invocar para realizar operaciones especí­ficas sobre los atributos.

Como en Java, en C Sharp utilizamos siempre clases y objetos, aún cuando no tengamos claro el concepto.

Se puede definir como una técnica o estilo de programación que utiliza objetos como bloque esencial de construcción.
Los objetos son en realidad como los tipos abstractos de datos. Un TAD es un tipo definido por el programador junto con un conjunto de operaciones que se pueden realizar sobre ellos. Se denominan abstractos para diferenciarlos de los tipos de datos fundamentales o básicos.
En C se puede definir un tipo abstracto de datos utilizando typedef y struct y la implementación de las operaciones con un conjunto de funciones.

C++
tiene muchas facilidades para definir y utilizar un tipo TAD.

Al igual que los tipos de datos definidos por el usuario, un objeto es una colección de datos, junto con las funciones asociadas, utilizadas para operar sobre esos datos. Sin embargo la potencia real de los objetos reside en las propiedades que soportan: herencia, encapsulación y polimorfismo, junto con los conceptos básicos de objetos, clases, métodos y mensajes.



objeto* se define mediante clases y structs, que conforman el plano único a partir del cual operan todos los objetos de ese tipo. Un objeto es una instancia de un tipo de clase.

La instanciación es el acto de crear una instancia de un objeto, la instancia es un objeto, la instanciación usa el operador new, después la instanciación es posible comunicarnos con el objeto a través de sus miembros.

Un Objeto es una colección de información relacionada y funcional.

Un objeto se compone de:

  • Datos que describen el objeto y
  • Operaciones que pueden ser realizadas por el objeto


campo*
objeto o valor contenido en una clase o estructura. Los campos permiten a las clases y estructuras encapsular datos.Para mayor simplicidad, estos ejemplos utilizan campos que son public, pero esto no se recomienda en la práctica. Los campos generalmente deberían ser private. El acceso a campos por parte de clases externas debería ser indirecto, por medio de métodos, propiedades o indizadores.


metodo*
La mayor parte de la funcionalidad es implementada en los métodos, los métodos son parte del Tipo (class), pero los métodos no son parte de la instancia (object).
son un bloque de código que contiene una serie de instrucciones. En C#, cada instrucción se ejecuta en el contexto de un método.Los métodos se declaran en una clase o estructura especificando el nivel de acceso, el valor devuelto, el nombre del método y los parámetros de método. Los parámetros de método se incluyen entre paréntesis y separados por comas. Los paréntesis vacíos indican que el método no requiere ningún parámetro.



funcion*

La función object.MemberWiseClone() puede ser utilizada para crear un clon de un objeto. La implementación por default de esta función produce una copia de un objeto, los campos de un objeto son copiados exactamente en lugar de ser duplicados:

 using System;

class Saludo{
public string s;
public Saludo(string s){
this.s = s;
}
}

class MiClase{
public Saludo saludo;
public MiClase(string s){this.saludo = new Saludo(s);}
public MiClase Clon(){return (MiClase)MemberwiseClone();}
}

class App{
public static void Main(){
MiClase miClase = new MiClase("Hello World!");
MiClase miClon = miClase.Clon();
Console.WriteLine("miClase : " + miClase.saludo.s);
Console.WriteLine("miClon : " + miClon.saludo.s);
miClon.saludo.s = "Hola Mundo";
Console.WriteLine("miClase : " + miClase.saludo.s);
Console.WriteLine("miClon : " + miClon.saludo.s);
}
}

Salida:

 miClase : Hello World!
miClon : Hello World!
miClase : Hola Mundo
miClon : Hola Mundo

El resultado anterior es porque la copia hecha por la función MemberWiseClonre() es una copia, el valor de saludo es el mismo en ambos objetos por lo que se se cambia un valor dentro del objeto Saludo afecta ambas instancias de MiClase.


La función Equals() es utilizada para determinar cuando dos objetos tienen el mismo contenido.

En el siguiente ejemplo se redefinen las funciones operator==() y operator!=(), para permitir la sintaxis del operador, estos operadores deben ser redefinidos en pares, no pueden ser redefinidos separadamente.

Ejemplo:

 using System;
class Empleado{
string usr;
string pwd;
public Empleado(string login, string pwd){
this.usr = login;
this.pwd = pwd;
}
public override string ToString(){
return("Usuario : " + usr + ", Password : " + pwd);
}
public override bool Equals(object o){
Empleado empB = (Empleado)o;
if(usr != empB.usr){return false;}
if(pwd != empB.pwd){return false;}
return true;
}
public static bool operator==(Empleado empA, Empleado empB){
return empA.Equals(empB);
}
public static bool operator!=(Empleado empA, Empleado empB){
return !empA.Equals(empB);
}
}
class App{
public static void Main(){
Empleado empleado1 = new Empleado("gangeles","123");
Empleado empleado2 = new Empleado("gangeles","123");
Console.WriteLine("El empleado1 es igual al empleado2: "+empleado1.Equals(empleado2));
Console.Write("empleado1 == empleado2 : ");
Console.Write(empleado1 == empleado2);
}
}

Salida:

 El empleado1 es igual al empleado2 : True
empleado1 == empleado2 : True

Al compilar el ejemplo anterior se presentara un warning indicando que no fue redefinada la función GetHashCode() ya que los valores que regresa son requeridos para ser relacionados al valor de regreso de Equals(). Cuando se invoca la función Equals() y dos objetos son iguales siempre se debe regresar el mismo código hash.

Si no es redefinido el código hash podría ser sólo identico para la misma instancia de un objeto y una búsqueda para un objeto que es igual pero no la misma instancia podría fallar.

Es posible utilizar un miembro que es único para el código hash, pero si no existe un valor único el código hash debería ser creado fuera de los valores contenidos en la función.

Si la clase no tiene un identificador único pero tiene tiene otros campos, podrías ser utilizados por la función hash:

 using System;
class Empleado{
string usr;
string pwd;
public Empleado(string login, string pwd){
this.usr = login;
this.pwd = pwd;
}
public override string ToString(){
return("Usuario : " + usr + ", Password : " + pwd);
}
public override bool Equals(object o){
Empleado empB = (Empleado)o;
if(usr != empB.usr){return false;}
if(pwd != empB.pwd){return false;}
return true;
}
public static bool operator==(Empleado empA, Empleado empB){
return empA.Equals(empB);
}
public static bool operator!=(Empleado empA, Empleado empB){
return !empA.Equals(empB);
}
public override int GetHashCode(){
return usr.GetHashCode() + pwd.GetHashCode();
}
}
class App{
public static void Main(){
Empleado empleado1 = new Empleado("gangeles","123");
Empleado empleado2 = new Empleado("gangeles","123");
Console.WriteLine("El empleado1 es igual al empleado2: "+empleado1.Equals(empleado2));
Console.Write("empleado1 == empleado2 : ");
Console.Write(empleado1 == empleado2);
}
}

La implementación del código GetHashCode anterior agrega los elementos y los regresa.


Función ToString()

Analice el siguiente ejemplo:

 using System;
class Empleado{
string usr;
string pwd;
public Empleado(string login, string pwd){
this.usr = login;
this.pwd = pwd;
}
}
class App{
public static void Main(){
Empleado empleado = new Empleado("gangeles","123");
Console.WriteLine("Empleado : " + empleado);
}
}

Salida: Empleado : Empleado

La salida fue el nombre de la clase Empleado ya que es la representación más cercana que encontro.

Es posible especificar algo con mayor sentido para ello se necesita redefinir la función ToString():

 using System;
class Empleado{
string usr;
string pwd;
public Empleado(string login, string pwd){
this.usr = login;
this.pwd = pwd;
}
public override string ToString(){
return("Usuario : " + usr + ", Password : " + pwd);
}
}
class App{
public static void Main(){
Empleado empleado = new Empleado("gangeles","123");
Console.WriteLine(empleado);
}
}

Salida: Usuario : gangeles, Password : 123



procedimiento*
rupo de instrucciones, variables, constantes, etc, que están diseñados con un próposito particular y tiene su nombre propio.
Después de escribir un procedimiento se usa su propio nombre como una sola instrucción o llamada al procedimiento.

*en c#

No hay comentarios: