¿Cuáles son las características básicas de la programación orientada a objetos?
Tres características principales de la orientación a objetos: encapsulación, herencia, polimorfismo
La orientación a objetos (orientada a objetos, abreviada como OO) es la esencia de la tecnología de software moderna. Desde los primeros SmallTalk hasta el floreciente Java, el pensamiento orientado a objetos está impregnado.
OO tiene tres características principales: encapsulación, herencia y polimorfismo. Si quieres dominar el pensamiento orientado a objetos, debes tener un conocimiento profundo de sus tres características principales.
Aquí trato de hablar lo menos posible sobre conceptos y solo uso un ejemplo de la vida real y un fragmento de código para explicarlos.
1. Encapsulación
La llamada encapsulación consiste en empaquetar y ocultar algo para que no pueda ser utilizado directamente por el mundo exterior y solo se pueda acceder a él a través de ciertos métodos específicos. OO considera todo como un "Objeto" y cualquier objeto tiene características y comportamientos. A sus características las llamamos "MemberVarible" y a su comportamiento "Member Function". Solo se puede acceder a las características encapsuladas a través de comportamientos específicos.
Todo el mundo ha visto un tipo de té muy utilizado en los hoteles, que consiste en envolver el té en una bolsa de papel y atarlo con un hilo. Al usarlo, simplemente póngalo en una taza de agua y remójelo. La ventaja de esto es que no dejarás hojas de té ni manchas de té por toda la taza.
¡Bien! Este es un ejemplo de encapsulación.
El propósito de beber té es disfrutar de la fragancia del té; por lo que el sabor del té es una de las características más importantes del té, pero no podemos disfrutarlo directamente; La fragancia está "encapsulada" por la bolsa de papel exterior. La única forma es "remojar" (diluir), tirar la bolsita de té en agua hirviendo y remojarla, y su sabor saldrá y se mezclará con el agua.
Si consideramos el té en bolsas como un objeto, proporciona la variable miembro Sabor y la función miembro Diluir
. Y Flavor es privado, no podemos tragarlo directamente, solo podemos disfrutar de Flavor a través de la función de miembro
Diluir.
A continuación se utiliza código C++ para describir este ejemplo:
Clase CTea
{
Privado:
Cstring m_Flavour; //Sabor
Cstring m_Color; //Color
... //Y otros atributos
Privado:
Void CTea(); //Constructor
Void ~CTea(); //Destructor
Público:
Cstring Dilute() ;//Preparando té
... //Y otros métodos
}
Cstring CTea::Dilute()
{
//Cómo crear código maloliente
}
Esto es encapsulación. Al declarar ciertas propiedades de un objeto como privadas para ocultarlas, solo se puede acceder a ellas utilizando los métodos
específicos que proporcionan.
2. Herencia
Si se trata solo de encapsulación, los lenguajes no orientados a objetos también pueden hacerlo parcialmente.
Por ejemplo, en C, algunas variables también se pueden encapsular usando estructuras (Struct) y
en VB usando tipos personalizados (Type).
La característica más atractiva de OO es la herencia. En términos sencillos, se llama herencia cuando los descendientes tienen ciertas características de sus antepasados. Por supuesto, los descendientes también pueden tener sus propias características únicas. Tomemos, por ejemplo, un cuchillo de cocina.
Los cuchillos de cocina (cubiertos) están hechos de acero (Acero), el acero es un tipo de metal (Metal) y el metal es un tipo de sustancia (Sustancia) en el mundo. Entonces, algunas de las propiedades del cuchillo de cocina se remontan a propiedades generales que tiene la materia. Es por este motivo que todas las clases de MFC heredan de CObject.
Esto es herencia. El cuchillo de cocina hereda directamente las propiedades del acero y el acero hereda las propiedades del metal... El siguiente código describe esta relación de herencia compleja y única:
Clase CSubstancia
{ p>
Privado:
int m_color
void CSubstance();
void ~CSubstance(); /...(Estoy estudiando artes liberales, así que no puedo decirte las propiedades específicas)
}
Clase CMetal :Public CSubstance
{
void CMetal();
void ~CMetal();
//.....
}
Clase CSteel: CMetal público
{
void CSteel();
void ~ CSteel(); //...
}
Clase CCutlery:Public CSteel
{
privado:
Cstring m_Blade;
void CCutlery();
void ~CCutlery();
// ......
Público :
void Cut();
}
Aquí, CSubstance se llama clase base (clase base), otras se llaman clases derivadas (clase derivada) . Las clases derivadas y las clases base tienen una relación "Es una especie de". La compleja relación de llamada a funciones entre subclases y sus clases antecesoras está más allá del alcance de este artículo.
La herencia es una relación jerárquica en forma de árbol. Si bien hereda las variables miembro y funciones miembro de la clase antecesora, una subclase también puede definir sus propias variables miembro y funciones miembro. Por ejemplo, además de heredar las características generales de Substance, Metal también tiene sus propios atributos como la escalabilidad; CCutlery también tiene sus propios miembros como "Blade", "Sharpness" y Behavior después de heredar las características de CSteel. "cortar" (Cortar) y así sucesivamente.
La tecnología orientada a objetos es una abstracción de la vida real. Puedes utilizar tu experiencia de vida para pensar en la lógica de la programación.
3. Polimorfismo (Polymorphism)
Antes de hablar del polimorfismo, primero debemos entender qué es "Virtual". C++/MFC utiliza la virtualización para lograr polimorfismo. ¿Por qué el concepto de "virtual"? Mire el siguiente ejemplo:
Clase Cincect //Clase de insecto
{
private:
int m_foot; pies
...... //Otras variables miembro
private:
void Cincect()
void ~Cincect ( );
public:
void Bite()//Bite
{
...... //Cómo Código para morder, como abrir la boca para masticar
}
}
Definí la acción de Morder como una acción generalizada en la clase base. Sin embargo, no todos los insectos pican de la misma manera a las personas
(y algunos no pican en absoluto, como las libélulas. Por ejemplo, los mosquitos pican a las personas con la boca
las pajitas). usan sus bocas para recoger.
De la categoría de insectos se derivan las siguientes dos categorías: Cant (hormigas) y Cmosquito (mosquitos).
clase No puedo :public Cincect //Clase hormiga
{
...
}
clase Cmosquito :public Cincect //Clase Mosquito
{
......
}
Todos heredan Todos los miembros de Cincect, por supuesto, también hereda la acción de Bite(). Ahora surge una pregunta:
También heredado de los insectos, ¿cómo podemos distinguir los métodos únicos de picadura de hormigas y mosquitos cuando usamos la acción Bite()?
Un método es utilizar el símbolo "::" para indicar a cuál se hace referencia específicamente, pero esto obviamente pierde flexibilidad.
Otro método es "virtual". Utilice la palabra clave virtual para declarar Bite() como una función virtual y luego redefínala en cada clase derivada
para describir sus respectivos métodos de mordida, y los resultados no serán los mismos cuando se llame.
Por lo tanto, el ejemplo anterior se puede reescribir como:
Class Cincect //Clase de insecto
{
private:
int m_foot; / Número de pies
... //Otras variables miembro
private:
void Cincect()
void ~Cincect; ();
public:
virtual Bite(){}// Muerde, pero solo declaramos esta función miembro,
// Pero déjalo hacerlo. nada y dejar que las clases derivadas definan las suyas
// Definir sus propios métodos de mordida
}
class Cant :public Cincect / /Ant class
{
...
mordida virtual();
}
Cant::Bite() p>
{
...... //La forma específica en que pican las hormigas
}
class Cmosquito :public Cincect //Clase de mosquitos
{
......
Mordida virtual();
}
Cmosquito: :Bite()
{
... //La forma específica en que los mosquitos pican a las personas
}
Por lo tanto, el propósito de virtual consiste en declarar únicamente un prototipo de una función miembro para una acción general en la clase base sin hacer una definición específica
y dejar que la clase derivada la defina por sí misma.
Esta es la tercera característica de la orientación a objetos: el polimorfismo. El mismo miembro de la clase base puede tener diferentes formas en diferentes clases derivadas para abstraer y describir mejor muchos "objetos" en el mundo.
1. Entender qué es el polimorfismo
2. Cómo definir un método virtual
3. 4. Cómo utilizar el polimorfismo en programas
Otro concepto importante en la programación orientada a objetos es el polimorfismo. En tiempo de ejecución, puede llamar a métodos en una clase derivada mediante un puntero a la clase base. Puede colocar un grupo de objetos en una matriz y luego llamar a sus métodos. En este caso, se refleja el efecto del polimorfismo. Estos objetos no tienen por qué ser objetos del mismo tipo. Por supuesto, si todas heredan de una determinada clase, puedes colocar estas clases derivadas en una matriz. Si estos objetos tienen métodos con el mismo nombre, puede llamar al método con el mismo nombre en cada objeto. Esta lección le mostrará cómo lograr estas cosas.
1. Listado 9-1. Clase base con métodos virtuales: DrawingObject.cs
usando System
clase pública DrawingObject
{
public virtual void Draw()
{
Console.WriteLine("Solo soy un objeto de dibujo genérico.");
p>
}
}
Descripción
El Listado 9-1 define la clase DrawingObject. Esta es una clase base de la que otros objetos pueden heredar. Esta clase tiene un método llamado Draw(). El método Draw() tiene un modificador virtual, que indica que las clases derivadas de la clase base pueden anular este método. El método Draw() de la clase DrawingObject hace lo siguiente: envía la declaración "Soy sólo un objeto de dibujo genérico" a la consola.
2. Listado 9-2. Clases derivadas con métodos sobrecargados: Line.cs, Circle.cs y Square.cs
usando System
public; clase Línea: DrawingObject
{
anulación pública void Draw()
{
Console.WriteLine("Soy una línea. ");
}
}
clase pública Círculo: ObjetoDibujo
{
anulación pública void Draw ()
{
Console.WriteLine("Soy un círculo."); >
clase pública Square: DrawingObject
{
anulación pública void Draw()
{
Console .WriteLine(" Soy un cuadrado.");
}
}
Descripción
El listado 9-2 define tres categorías. Estas tres clases se derivan de la clase DrawingObject. Cada clase tiene un método Draw() con el mismo nombre, y cada uno de estos métodos Draw() tiene un modificador de sobrecarga. El modificador de sobrecarga permite que el método sobrecargue el método virtual de su clase base en tiempo de ejecución. La condición para lograr esta función es que se haga referencia a la clase a través de una variable de puntero del tipo de clase base.
3. Listado 9-3. Programa para implementar polimorfismo: DrawDemo.cs
usando System
clase pública DrawDemo
{
public static int Main(string[] args)
{
DrawingObject[] dObj = new DrawingObject[4]; dObj[0] = nueva Línea();
dObj[1] = nuevo Círculo();
dObj[2] = nuevo Cuadrado(); >dObj[3] = nuevo DrawingObject();
foreach (DrawingObject drawObj en dObj)
{
drawObj.Draw();
p>
}
devuelve 0
}
}
Descripción
El Listado 9-3 demuestra la implementación del polimorfismo utilizando las clases definidas en el Listado 9-1 y el Listado 9-2. En el método Main() de la clase DrawDemo, se crea una matriz y los elementos de la matriz son objetos de la clase DrawingObject. La matriz se denomina dObj y consta de cuatro objetos de tipo DrawingObject.
A continuación, inicialice la matriz dObj. Dado que las clases Línea, Círculo y Cuadrado son clases derivadas de la clase DrawingObject, estas clases se pueden utilizar como tipos de elementos de la matriz dObj. Si C# no tuviera esta funcionalidad, tendría que crear una matriz para cada clase. La naturaleza de la herencia permite que los objetos derivados se utilicen como miembros de la clase base, ahorrando así carga de trabajo de programación.
Una vez inicializado el array, se ejecuta un bucle foreach para encontrar cada elemento del array. En cada bucle, cada elemento (objeto) de la matriz dObj llama a su método Draw(). El polimorfismo se refleja en: en tiempo de ejecución, el método Draw() de cada objeto se llama por separado. Aunque el tipo de objeto de referencia en la matriz dObj es DrawingObject, esto no afecta a la clase derivada por sobrecargar el método virtual Draw() de la clase DrawingObject. En la matriz dObj, llame al método Draw() sobrecargado en la clase derivada a través de un puntero a la clase base DrawingObject.
El resultado de salida es:
Soy una línea
Soy un círculo.
Soy un cuadrado.
Solo soy un objeto de dibujo genérico.
En el programa DrawDemo, se llama al método Draw() sobrecargado de cada clase derivada. En la última línea se ejecuta el método virtual Draw() de la clase DrawingObject. Esto se debe a que al final de la ejecución, el cuarto elemento de la matriz es un objeto de la clase DrawingObject.
Resumen
Ahora que comprende el polimorfismo, puede implementar un método en una clase derivada que anule el método virtual de la clase base. La relación entre los métodos virtuales y los métodos de clase derivados sobrecargados refleja el polimorfismo de C#.