Hablar de clases y objetos en Delphi.
1. No puedo entender varios conceptos sin estar educado.
Hablando de clases y objetos, no podemos dejar de mencionar los siguientes conceptos: clases, objetos e instancias. Personalmente creo que está bien
Entiéndalo de esta manera: objeto se refiere a un término general, y cualquier entidad en la naturaleza puede considerarse como un objeto, mientras que clase se refiere a;
Una serie de categorías que se dividen en ciertas características de estos objetos; una instancia se refiere específicamente a un objeto que pertenece a una determinada categoría.
Bien, no necesito decir más sobre estos grandes principios. ¿Por qué no adoptar un enfoque "contrario", usemos Delphi?
Código para explicar algunos conceptos propuestos por estos extranjeros que son difíciles de entender para los chinos:
var
ABtn:TBotón;
Defina ABtn como un objeto que pertenece a la clase TButton, pero no se puede decir que ABtn sea una instancia porque no tiene
se crea, por eso decimos que se define un objeto si se define una instancia, más o menos.
Algunas no son lo suficientemente precisas. :)
comenzar
ABtn:=TButton.Create(Self);//Crear una instancia de TButton
ABtn.Caption:='objeto';
ABtn.Libre;
fin;
2. El objeto es un puntero absoluto.
Desde un punto de vista físico, el objeto es un espacio de direcciones y el símbolo de este espacio de direcciones es lo que definimos.
Clase "variable". Entonces podemos pensar en un objeto como un puntero a una clase. Como todos sabemos, para acceder a un puntero, simplemente
El puntero debe estar inicializado. Dado que el objeto es un puntero, debe inicializarse. ¿Cómo inicializarlo?
Hablemos de la inicialización de punteros. Hay dos formas de inicializar un puntero:
(1) Distribución directa
var
Pinta:^Entero;
comenzar
nuevo (pinta);
Pinta^:=12;
Desechar (pinta);
fin;
(2) Variables que apuntan a otros espacios asignados.
var
Pinta:^Entero;
yo: entero;
comenzar
yo:=12;
Pinta:=@i;
fin;
Curiosamente, hay dos formas de inicializar "punteros" como objetos:
(1) Distribución directa
var
Formulario A: Formulario T;
comenzar
AForm:=TForm.Create(Self);
AForm.ShowModal;
AForm.Gratis;
fin;
(2) Señalar otras instancias de espacio asignado
var
Formulario A: Formulario T;
comenzar
Formulario A:=Yo;
AForm.Caption:='¿Lo sabes? ¿Por qué sucede esto?';
fin;
file://Este AForm y la instancia del formulario al que apunta comparten la misma unidad de dirección, y todas las operaciones en el AForm responderán
file:// a su instancia de formulario correspondiente.
Hablando de eso, podemos explicar fácilmente por qué los parámetros del objeto del procedimiento (función) se pasan en un formato como este:
(1) Conjunto de procedimientosEditar(var Editar:TEdit);
comenzar
Editar.Texto:='11';
fin;
y
(2) procedimiento SetEdit(Editar:TEdit);
comenzar
Editar.Texto:='11';
fin;
El efecto es el mismo. (1) es pasar una entidad TEdit como referencia de parámetro, (2) es
Pase un "puntero" de objeto TEdit como parámetro.
3. La clase puede entenderse como un tipo de datos especial.
Sabemos que los tipos de datos pueden verse obligados a realizar una conversión de tipos. Dado que una clase puede entenderse como un tipo de datos, entonces.
Entonces también debería poder realizar la conversión de tipo de clase. Por ejemplo, el siguiente código es un evento de clic de un botón (Botón1):
(uno)
procedimiento TForm1.Button1Click(Remitente: TObject);
var
ASubtítulo:Cadena;
comenzar
ACaption:=TButton(Sender).Caption;//El remitente se convierte de TObject a TButton
ShowMessage(Format('¡Hiciste clic en ''%s''!',[ACaption]));
fin;
En este código, el remitente es un objeto de tipo TObject y lo convertimos al tipo TButton. como usted
Si no puede ver con claridad, puede consultar nuestra conversión de tipo de datos habitual:
(dos)
procedimiento TForm1.Button1Click(Remitente: TObject);
var
S_Str:Cadena;
P_Str:PChar;
comenzar
S_Str:='¡Me encanta China!';
P_Str:=PChar(S_Str);
S_Str:='';
S_Str:=Cadena(P_Str);
Mostrar mensaje(S_Str);
fin;
Sin embargo, en el proceso de programación orientada a objetos, el énfasis está en la seguridad. Por ejemplo, la conversión de tipo forzada en (1) tiene muchos problemas.
Seguridad. El siguiente código todavía escribe el evento Button1.OnClick:
(tres)
procedimiento TForm1.Button1Click(Remitente: TObject);
comenzar
TCanvas(Remitente).Brush.Color:=clRed;
fin;
Si lo ejecuta, se producirá un error. ¿No viola esto el propósito de la programación orientada a objetos? No, por supuesto
Si es una clase, debería haber un método de coerción de clase específico de la clase. El método para cambiar (3) es el siguiente:
(Cuatro)
procedimiento TForm1.Button1Click(Remitente: TObject);
comenzar
(Remitente como TCanvas).Brush.Color:=clRed;
end;// Utilice as para convertir, ya que puede detectar el error y no afectará el funcionamiento normal del programa.
Hablando de eso, permítanme mencionar VB por cierto. Si han aprendido VB, es posible que la matriz de control le resulte más agradable, especialmente en.
Al escribir un programa como una calculadora. Pero ¿qué nos aporta Delfos? La respuesta es que Delphi también se puede abrir de forma rápida y concisa.
Emitir dicho programa. Si hace esto: coloque un Editar y diez botones en el formulario, divida Button.Caption en
No lo establezca en '0', '1', '2',... '9' y luego escriba el evento OnClick de un botón de la siguiente manera:
(cinco)
procedimiento TForm1.Button1Click(Remitente: TObject);
comenzar
Edit1.Text:=Edit1.Text+(Remitente como TButton).Caption;
fin;
Asocie los eventos OnClick de otros Botones a Button1Click y ejecute el programa. ¡Aplaude! Esta calculadora
El prototipo del programa ya está disponible. Usamos la conversión de tipos de clases de Delphi para desarrollar una función de matriz de control similar a la de VB.
¡El programa también es genial!
4. Clase abstracta y sus instancias.
Hay una clase en Delphi llamada clase abstracta, y no se puede crear ingenuamente una instancia de ella directamente. Tales como: TStrings
amable. El siguiente código:
(uno)
var
StrLst:TStrings;
comenzar
StrLst:=TStrings.Create;
StrLst.Add('¡Me encanta Japón!');
StrLst.Gratis;
fin;
Esto no está bien. Entonces, ¿cómo se construyen instancias de clases abstractas como TStrings? La respuesta es utilizar su sistema sin bombeo.
Subclase de elefantes. Sabemos que TStrings tiene una subclase no abstracta de TStringList. Podemos hacer esto:
(dos)
var
StrLst:TStrings;
comenzar
StrLst:=TStringList.Create;//Subclase StrLst con la ayuda de su constructor de subclase
StrLst.Add('¡Amo China!');
StrLst.Gratis;
fin;
(tres)
var
StrLst:TStringList;
comenzar
StrLst:=TStringList.Create;
file://Ríndete, ya no uses clases abstractas, solo usa su "hijo" para hacer tus negocios
StrLst.Add('¡Amo China!');
StrLst.Gratis;
fin;
5. Las clases son un mecanismo altamente encapsulante para datos y operaciones.
(1) Encapsulación de datos
unidad Unidad2;
interfaz
tipo
Empleado=clase
privado
FNombre:Cadena;
público
Constructor Crear;
función ObtenerNombre:Cadena;
procedimiento SetName(AName:String);
fin;
implementación
{ Empleado }
constructor TEmployee.Create;
comenzar
FName:='Fuego Ardiente';
fin;
función TEmployee.GetName: Cadena;
comenzar
Resultado:=NombreF;
fin;
procedimiento TEmployee.SetName(AName: String);
comenzar
FNombre:=UNombre;
fin;
fin.
Como se muestra en el código anterior, utilizamos un procedimiento SetName y una función GetName para configurar completamente la variable privada FName.
Encapsulación. Esto es todo lo que necesitamos hacer con FName:
usos
unidad2;
procedimiento TForm1.Button1Click(Remitente: TObject);
var
AEmpleado:TEmpleado;
comenzar
AEmpleado:=TEmployee.Create;
AEmployee.SetName('Rose');//Utilice SetName para configurar FName
MessageBox(Handle,PChar(AEmployee.GetName),'Empoyee',0);
file://Utilice GetName para acceder a FName
AEmpleado.Gratis;
fin;
(2) Encapsulación de operaciones
unidad Unidad2;
interfaz
tipo
TDivisión=Clase
público
file://polymorphism hace que su programa sea más "flexible"
función GetDiv(Num1,Num2:Double):Double;sobrecarga;
función GetDiv(Num1,Num2:entero):entero;sobrecarga;
fin;
implementación
{División}
función TDivision.GetDiv(Num1, Num2: Doble): Doble;
comenzar
intentar
Resultado:=Núm1/Núm2;
excepto
Resultado:=0;//Proporciona un mecanismo de procesamiento de viñetas para manejar la situación en la que el divisor es 0
fin;
fin;
función TDivision.GetDiv(Num1, Num2: entero): entero;
comenzar
intentar
Resultado:=Num1 div Num2;
excepto
Resultado:=0;//Proporciona un mecanismo de procesamiento de viñetas para manejar la situación en la que el divisor es 0
fin;
fin;
fin.
En el código anterior, usamos el mecanismo de polimorfismo de la clase para procesar la división en división entera y división no entera respectivamente, y usamos la pantalla de manejo de excepciones para
Para eliminar el caso donde el número es 0, para garantizar la seguridad de la operación, al llamar, podemos hacerlo así:
usos
unidad2;
{$R *.dfm}
procedimiento TForm1.Button1Click(Remitente: TObject);
var
División:TDivisión;
IValor: entero;
FValor:Doble;
comenzar
División:=TDivision.Crear;
IValue:=Division.GetDiv(1,2);
FValue:=Division.GetDiv(1.0,2);
IValue:=Division.GetDiv(1,0);
FValue:=Division.GetDiv(1.0,0);
División.Gratis;
fin;
6. Las clases son un mecanismo de reutilización de código.
Por ejemplo, en 5, si queremos agregar una función GetAdd a esta clase para realizar operaciones de suma, podemos usar la herencia de clases. como
Sólo escribe:
(uno)
unidad Unidad2;
interfaz
tipo
TDivisión=Clase
público
función GetDiv(Num1,Num2:Double):Double;sobrecarga;
función GetDiv(Num1,Num2:entero):entero;sobrecarga;
fin;
tipo
TOperación=Clase(TDivisión)
público
función GetAdd(Num1,Num2:Doble):Doble;
fin;
implementación
{División}
función TDivision.GetDiv(Num1, Num2: Doble): Doble;
comenzar
intentar
Resultado:=Núm1/Núm2;
excepto
Resultado:=0;
fin;
fin;
función TDivision.GetDiv(Num1, Num2: entero): entero;
comenzar
intentar
Resultado:=Num1 div Num2;
excepto
Resultado:=0;
fin;
fin;
{TOPeración}
función TOperation.GetAdd(Num1, Num2: Doble): Doble;
comenzar
Resultado:=Núm1+Núm2;
fin;
fin.
Aquí heredamos una subclase TOPeration de TDivision. La operación puede tener TDivsion
El método público GetDiv tiene su propio método único GetAdd. Esta es la clase que nos ofrece la clase "toma tu pastel y cómelo también".
Método "Obtener". No está mal :)