¿Cómo empezar a crear mis propias clases con Delphi?

publiquéuna pregunta Hace unos días, y las respuestas me dijeron que creara mis propias clases.

Soy programador de la vieja escuela desde los días previos a la programación orientada a objetos (OOP). Mi programación está bien estructurada, es eficiente y está organizada, pero carece de cualquier OOP personalizado que no sea el uso de objetos de Delphi y de terceros.

Había visto cómo funcionaban las clases orientadas a objetos de Delphi cuando empecé a usar Delphi 2, pero parecían ajenas a mi formación en programación. Entiendo cómo eran y son excelentes para los desarrolladores que diseñan componentes y para los controles visuales en la interfaz de usuario. Pero nunca encontré la necesidad de usarlos en la codificación de mi programa.

Así que ahora vuelvo a mirar, 15 años después, a las clases de Delphi y OOPing. Si tomo, por ejemplo, una estructura que tengo como:

type
  TPeopleIncluded = record
    IndiPtr: pointer;
    Relationship: string;
  end;
var
  PeopleIncluded: TList<TPeopleIncluded>;

Entonces, un defensor de la OOP probablemente me dirá que haga de esta una clase. Lógicamente, creo que esta sería una clase heredada de la lista genérica TList. Supongo que esto se haría así:

TPeopleIncluded<T: class> = class(TList<T>)

Pero ahí es donde me quedo atascado, y no tengo buenas instrucciones sobre cómo hacer el resto.

Cuando miro una clase que Delphi tiene como ejemplo en la unidad Generics.Collections, veo:

TObjectList<T: class> = class(TList<T>)
private
  FOwnsObjects: Boolean;
protected
  procedure Notify(const Value: T; Action: TCollectionNotification); override;
public
  constructor Create(AOwnsObjects: Boolean = True); overload;
  constructor Create(const AComparer: IComparer<T>; AOwnsObjects: Boolean = True); overload;
  constructor Create(Collection: TEnumerable<T>; AOwnsObjects: Boolean = True); overload;
  property OwnsObjects: Boolean read FOwnsObjects write FOwnsObjects;
end;

Y luego sus definiciones de los constructores y procedimientos son:

{ TObjectList<T> }

constructor TObjectList<T>.Create(AOwnsObjects: Boolean);
begin
  inherited;
  FOwnsObjects := AOwnsObjects;
end;

constructor TObjectList<T>.Create(const AComparer: IComparer<T>; AOwnsObjects: Boolean);
begin
  inherited Create(AComparer);
  FOwnsObjects := AOwnsObjects;
end;

constructor TObjectList<T>.Create(Collection: TEnumerable<T>; AOwnsObjects: Boolean);
begin
  inherited Create(Collection);
  FOwnsObjects := AOwnsObjects;
end;

procedure TObjectList<T>.Notify(const Value: T; Action: TCollectionNotification);
begin
  inherited;
  if OwnsObjects and (Action = cnRemoved) then
    Value.Free;
end;

Permítame decirle que esta definición de clase "simple" puede ser obvia para aquellos de ustedes que han usado OOP en Delphi durante años, pero para mí solo me ofrece cientos de preguntas sin responder sobre qué uso y cómo lo uso. .

Para mí, esto no parece ser una ciencia. Parece ser un arte de cómo estructurar mejor su información en objetos.

Entonces, esta pregunta, y espero que no se cierre porque realmente necesito ayuda con esto, es dónde o cómo obtengo las mejores instrucciones sobre el uso de Delphi para crear clases, y cómo hacerlo de la forma Delphi adecuada.

Respuestas a la pregunta(1)

Su respuesta a la pregunta