(Parte 3 de "Implementar pensamientos orientados a objetos: hablar sobre el desarrollo de Delphi")
Los dos primeros artículos discutieron temas relacionados con la encapsulación. Aquí quiero hablarles sobre herencia y polimorfismo.
La herencia y el polimorfismo están estrechamente relacionados. Object Pascal introduce un mecanismo polimórfico llamado sobrecarga. Su idea tiene poco que ver con la orientación a objetos y no se discutirá aquí. Nos centramos en el polimorfismo, que está estrechamente relacionado con el pensamiento orientado a objetos.
El polimorfismo se basa en los conceptos de métodos abstractos y métodos virtuales, y también está estrechamente relacionado con la herencia. Se cree que a menudo definimos algunos objetos subyacentes y luego definimos algunas de sus implementaciones como abstractas, lo que significa que solo definimos la interfaz sin definir detalles de implementación específicos. Siguiendo esta idea, también definiremos múltiples objetos derivados (heredados), en los que en realidad se implementan detalles que no se han implementado en la clase ancestral. Esto hace que la clase subyacente que definimos previamente sea polimórfica. La ventaja de este mecanismo es que cuando usamos estas clases, solo necesitamos un conjunto de código para completar múltiples funciones. Lo único que debe cambiar es la parte que crea una instancia del objeto.
Observe una clase como esta:
TStream = clase(TOobjeto)
…
público
función Leer (var Buffer; Contar: Entero largo): Entero largo virtual;
función Escritura (búfer constante; Conteo: Entero largo): Entero largo;
…
fin;
Las palabras reservadas virtuales y abstractas indican que los métodos de lectura y escritura son funciones virtuales puras. Esto muestra que la clase TStream realmente no se puede usar (no se pueden crear instancias de esta clase. Es solo una clase similar a una interfaz, que define las funciones básicas que la clase TStream debe tener y debe manejar). Y también estipula que otras clases derivadas de la clase TStream deben implementar funciones (como lectura y escritura, etc.).
Por ejemplo, TFileStream implementa la clase TStream en forma de aplicaciones de archivos de disco, mientras que TMemoryStream implementa la clase TStream en forma de aplicaciones de memoria. Ahora supongamos que hay una clase TMyClass que proporciona un método SaveToStream:
TMiClase = Clase(TOobjeto)
Procedimiento SaveToStream(Stream: TStream);
fin;
Luego, aplicando la idea del polimorfismo, puedes tener un código como este:
var
cadena: TStream;
MiClase: TMyClass;
comenzar
strm := TFileStream.Create('abc.txt'); // ß El tipo de instancia real de Stream aquí es TFileStream
MiClase := TMyClass.Create;
MiClase.SaveToStream(strm);
…..
fin;
Para almacenar el contenido de MyClass en la memoria, simplemente cambie
strm := TFileStream.Create('abc.txt');
para:
strm := TMemoryStream.Create;
Eso es todo.
El uso del polimorfismo requiere dos aspectos de trabajo. Uno es, por supuesto, que el polimorfismo se tenga en cuenta en la estructura de clases y pueda proporcionar clases intermedias (clases abstractas) que implementen ciertas funciones; clases.This El trabajo se refleja en la definición de algunos procedimientos y parámetros de funciones.
Otro punto muy importante, me gustaría recordarles a todos que la planificación de clases es muy importante en la era de la programación orientada a objetos, el marco de clases determina en gran medida el marco del programa y determina el éxito o el fracaso del desarrollo de software. Una arquitectura de clases clara y jerárquica no solo facilita la división y expansión funcional, sino que también facilita el mantenimiento del código. Entre estos, aplicar las ideas de herencia y polimorfismo, introducir clases abstractas e introducir clases intermedias es un método más preferible.
A continuación se enumeran algunas de las clases abstractas y clases concretas proporcionadas en Delphi:
clase concreta derivada de clase abstracta
TStream TFileStream, TMemoryStream;
TCustomIniFile TIniFile, TMemIniFile, TRegistryIniFile;
TStrings TStringList, TMemoStrings, TListBoxStrings;
Hay muchos más, esperando que tú y yo los descubramos. El más utilizado aquí es TStream, y lo que más me sorprende es TCustomIniFile. ¡Su TRegistryIniFile te permite acceder al registro de la misma manera que IniFile! Esto me permite usar un conjunto de códigos para implementar las funciones de escribir el registro y escribir archivos INI. Aunque la tecnología involucrada es simple, ¡su importancia es extraordinaria!
(Sin terminar, continuará)
Más artículos