Universidad Católica Nordestana (UCNE) Preparado por Ing. Nelson Abreu. Febrero, 2012. San Francisco de Macorís. República Dominicana. Objeto: es una colección de datos y una serie de rutinas miembro, entre las que se destacan los métodos. Representan cosas físicas y abstractas, pero que tienen un estado y un comportamiento. Clases: son estructuras o plantillas que sirven para definir un objeto. Describe la constitución de un objeto y sirve como plantilla para construir objetos, especificando la interfaz pública de un objeto. Declaración y Creación de un objeto Un objeto es una instancia de una clase. La creación de una instancia se conoce como instanciación. NombreClase nombreObjeto; Circulo miCirculo; //declara la clase círculo La declaración no crea el objeto. Para crear el objeto hay que usar el operador new con el objeto. miCirculo = new Circulo(); public Declara un tipo o miembro visible a todos los programas. Es la accesibilidad por defecto para los miembros de enumeraciones e interfaces. protected Declara al miembro de una determinada clase únicamente accesible desde dicha clase y sus clases derivadas. internal Declara un tipo o miembro accesible sólo dentro del ensamblado al que pertenece. protected internal Declara el miembro de una determina clase únicamente accesible desde dicha clase y sus clases derivadas o dentro del ensamblado al que pertenece. private Declara un miembro sólo visible en su contenedor. Es la accesibilidad por defecto para los miembros de clases y estructuras. Superclase Se conoce como la clase padre y es la clase ya existente. Subclase Se conoce también como clase hija, clase derivada o clase extendida. En C#, salvo la clase Object, cada clase tiene una superclase y esta última es la clase padre de todas las clases. Una clase derivada extiende su clase padre inmediata y puede agregar nuevos miembros a aquellos que hereda, pero no puede borrar la definición de un miembro heredado; constructores y destructores no se heredan. public class nombreClase : ClaseBase Ejemplo: public class Estudiante : Persona La herencia es siempre transitiva, de modo que una clase puede heredar características de superclases de muchos niveles. VENTAJAS ◦ Facilidad de modificación de clases. ◦ Evita la duplicación de estructura-código idéntico o similar en clases diferentes. ◦ Organización de objetos en jerarquía. ◦ Adaptación de programas para trabajar en situaciones similares pero diferentes. class Personas { protected string nombre; public Personas() { } public Personas(string nom) { nombre = nom; } public string Nombre { get { return nombre; } } } class Empleado : Personas { private string domicilio; public Empleado(string nombre, string d) :base(nombre) { domicilio = d; } } public Empleado() : base("Anonimo") { domicilio = "--"; } public string Domicilio { get { return domicilio; } } El lenguaje C# proporciona diversos modificadores, tanto para las clases como para los miembros, que puede alterar aspectos del proceso de herencia, como: new, virtual, abstract, static, override, sealed. Son clases a partir de las cuales se pueden crear instancias (objetos). Una clase abstracta no puede ser instanciada. Es decir, no se puede crear una instancia de una clase abstracta usando el operador new. Tal clase sólo se puede utilizar como una clase PADRE para crear un nuevo tipo de objeto y no puede llevar el modificador sealed. La declaración de un método abstracto sólo se puede realizar en una clase abstracta. Un método abstract debe ser redefinido por una subclase y por lo tanto no puede ser privado. Son clases de las que no es posible crear instancias; frecuentemente, están implementadas sólo parcialmente o no están implementadas. (definición en MSDN library). Una clase abstracta es aquella que forzosamente se ha de derivar si se desea que se puedan crear objetos de la misma o acceder a sus miembros estáticos. Cuando se aplica a una clase indica que la clase no se puede extender, es decir, que no puede ser una clase padre. También se aplica a métodos que redefinen otros virtuales heredados para evitar que futuras clases virtuales derivadas puedan seguir redefiniendo el método y garantizar al usuario que el comportamiento de la clase no puede ser modificado por una clase posterior. No se puede usar el modificador abstract en una clase sealed. El lenguaje C# está diseñado de modo que las versiones entre las clases base y derivadas de diferentes bibliotecas puedan evolucionar y mantener la compatibilidad con versiones anteriores. Esto significa, por ejemplo, que la inserción de un nuevo miembro en una clase base con el mismo nombre que un miembro de una clase derivada es totalmente compatible con C# y no lleva a un comportamiento inesperado. También significa que una clase debe declarar explícitamente si un método va a reemplazar a un método heredado o si es un nuevo método que simplemente oculta un método heredado con un nombre similar. Al declarar un método como virtual éste podrá ser redefinido en la clases derivadas y seguramente tendrán distintas implementaciones del mismo en cada una de ellas. Cuando el método es virtual, en lugar de determinar la implementación del método en tiempo de compilación, se determina en tiempo de ejecución. Un método virtual no puede ser declarado privado. El modificador override permite definir una nueva implementación de un miembro virtual heredado de una clase base. C# permite que las clases derivadas contengan métodos con el mismo nombre que los métodos de clase base. El método de la clase base debe definirse como virtual. Si el método de la clase derivada no va precedido de las palabras clave new u override, el compilador emite una advertencia y el método se comporta como si la palabra clave new estuviera presente. Si el método de la clase derivada va precedido de la palabra clave new, el método se define como independiente del método de la clase base. Si el método de la clase derivada va precedido de la palabra clave override, los objetos de la clase derivada llamarán a ese método, no al método de la clase base. El método de la clase base puede llamarse desde dentro de la clase derivada con la palabra clave base. Las palabras clave override, virtual y new también pueden aplicarse a propiedades, indizadores y eventos. Con la palabra clave new se indica al compilador que la definición oculta la definición contenida en la clase base. Éste es el comportamiento predeterminado. Significa que los datos y las acciones se combinan en una sola entidad y se ocultan los detalles de la implementación. La POO encapsula datos y métodos en objetos. Los objetos tienen la propiedad de ocultación de información. Que quiere decir que aunque los objetos puedan comunicarse uno con otros a través de interfaces bien definidas, no pueden conocer como están implementados otros objetos. Es una palabra que significa “múltiples formas” y es una de las características más importantes de la programación orientada a objetos. Es la propiedad de que a la misma palabra se le asignan múltiples definiciones. Polimorfismo Puro ◦ Se produce cuando una única función se puede aplicar a argumentos de una variedad de tipos. En polimorfismo puro hay una función y un número de interpretaciones. Polimorfismo ad hoc ◦ Se produce cuando se dispone de un número de funciones diferentes todas representadas por el mismo nombre. Esta propiedad también se llama sobrecarga. Permite que el programador implemente un operador para que ejecute operaciones definidas por el usuario cuando al menos uno de los operandos sobre los que actúa sea de la clase o estructura, definida por el usuario, que contiene la declaración del operador estándar. Se utiliza un método estático, cuyo nombre es el del operador que se va a sobrecargar precedido de la palabra reservada operator. public static Complejo operator+(Complejo x, Complejo y) { Complejo c = new Complejo(x.r + y.r, x.i+y.i); return c; } public static Complejos operator +(Complejos x, int constante) { Complejos c = new Complejos(x.real + constante, x.img); return c; } Son funciones que se pueden utilizar sin necesidad de instanciar un objeto de clase. https://msdn.microsoft.com/eses/library/bb882516.aspx public static class MisExtensiones //la clase debe ser estática { public static double TotalBalances(this List<Estudiantes> estudiantes) { double total = 0; foreach (Estudiantes est in estudiantes) { total += est.Balance; } return total; } } public class Estudiantes //la clase con la que se va a trabajar { public string Nombre { get; set; } public string Apellido { get; set; } public double Balance { get; set; } } List<Estudiantes> estudiante = new List<Estudiantes> { new Estudiantes { Apellido="Abreu", Nombre="Nelson", Balance=3}, new Estudiantes { Apellido="Abreu", Nombre="Nelson", Balance=23}, new Estudiantes { Apellido="Abreu", Nombre="Nelson", Balance=3}, }; Console.WriteLine(estudiante.TotalBalances());