(Parte 3 de "Colocando pensamentos orientados a objetos - falando sobre desenvolvimento em Delphi")
Os dois primeiros artigos discutiram tópicos relacionados ao encapsulamento. Aqui, quero falar com você sobre herança e polimorfismo.
Herança e polimorfismo estão intimamente relacionados. Object Pascal introduz um mecanismo polimórfico chamado sobrecarga. Sua ideia tem pouco a ver com orientação a objetos e não será discutida aqui. O polimorfismo, que está intimamente relacionado ao pensamento orientado a objetos, é o que nos concentramos.
O polimorfismo depende dos conceitos de métodos abstratos e métodos virtuais e também está intimamente relacionado à herança. Pensa-se que frequentemente definimos alguns objetos subjacentes e depois definimos algumas de suas implementações como abstratas, o que significa que apenas definimos a interface sem definir detalhes específicos de implementação. Seguindo essa ideia, também definiremos vários objetos derivados (herdados), nos quais os detalhes que não foram implementados na classe ancestral são realmente implementados. Isso torna a classe subjacente que definimos anteriormente polimórfica. A vantagem desse mecanismo é que quando usamos essas classes, precisamos apenas de um conjunto de códigos para completar múltiplas funções. A única coisa que precisa mudar é a parte que cria uma instância do objeto.
Observe uma aula como esta:
TStream = classe(TObject)
…
público
função Read(var Buffer; Contagem: Longint): Longint virtual;
função Write (const Buffer; Contagem: Longint): Longint virtual;
…
fim;
As palavras reservadas virtual e abstrata indicam que os métodos Read e Write são funções virtuais puras. Isso mostra que a classe TStream realmente não pode ser usada (instâncias desta classe não podem ser criadas). É apenas uma classe semelhante a uma interface, que define as funções básicas que a classe TStream deve ter e precisa manipular. E também estipula que outras classes derivadas da classe TStream devem implementar funções (como Read e Write, etc.).
Por exemplo, TFileStream implementa a classe TStream na forma de aplicativos de arquivo em disco, enquanto TMemoryStream implementa a classe TStream na forma de aplicativos de memória; Agora suponha que exista uma classe TMyClass que forneça um método SaveToStream:
TMyClass = Classe(TObject)
Procedimento SaveToStream(Stream: TStream);
fim;
Então aplicando a ideia de polimorfismo, você pode ter um código como este:
var
strm: TStream;
MinhaClasse: TMyClass;
começar
strm := TFileStream.Create('abc.txt'); // ß O tipo de instância real de Stream aqui é TFileStream
MinhaClasse := TMyClass.Create;
MinhaClasse.SaveToStream(strm);
…..
fim;
Para armazenar o conteúdo de MyClass na memória, basta alterar
strm := TFileStream.Create('abc.txt');
para:
strm := TMemoryStream.Create;
É isso.
O uso do polimorfismo requer dois aspectos de trabalho. Um é, claro, que o polimorfismo seja levado em consideração na estrutura da classe e possa fornecer classes intermediárias (classes abstratas) que implementem certas funções; classes Este trabalho se reflete na definição de alguns procedimentos e parâmetros de funções.
Outro ponto muito importante, gostaria de lembrar a todos que o planejamento de aulas é muito importante na era da programação orientada a objetos, a estrutura da classe determina em grande parte a estrutura do programa e determina o sucesso ou o fracasso do desenvolvimento de software. Uma arquitetura de classes clara e hierárquica não apenas facilita a divisão e expansão funcional, mas também facilita a manutenção do código. Entre estes, aplicar as ideias de herança e polimorfismo, introduzir classes abstratas e introduzir classes intermediárias é o método mais preferível.
A seguir listamos algumas das classes abstratas e concretas fornecidas no Delphi:
classe concreta derivada de classe abstrata
TStream TFileStream, TMemoryStream;
TCustomIniFile TIniFile, TMemIniFile, TRegistryIniFile;
TStrings TStringList, TMemoStrings, TListBoxStrings;
Há muitos mais, esperando que você e eu descubramos. O mais usado aqui é o TStream, e o que mais me surpreende é o TCustomIniFile. Seu TRegistryIniFile permite acessar o registro da mesma forma que o IniFile! Isso me permite usar um conjunto de códigos para implementar as funções de gravação do registro e gravação de arquivos Ini. Embora a tecnologia envolvida seja simples, o seu significado é extraordinário!
(Inacabado, continua)
Mais artigos