Lo que explico Mario (si se me permite llamarte por tu nombre

) es basicamente lo que hago (intento) desde casi que inicio en el mundo del OO + Relacional
En las versiones mas modernas de Delphi es mas sencillo todavia, ya que podes crearte la clase que el te dijo, un TObjectList<TTuClase> y enlazarla por LiveBindings. En un plumazo tenes separada la logica de tu aplicacion, del acceso a los datos, de la presentacion visual
Yo creo lo mejor es dar un pequeño paso mas, y pedirle a una clase que te retorne la instancia en cuestion de la forma que el lo propone. Es decir, tus clases de negocio en un principio no tienen porque saber que van a ser guardadas en una BD
Si sigo con el ejemplo del Dog
Código Delphi
[-]
TDog = class
public
property Name: string read FName write SetAge;
property Age: Integer read FAge write SetAge;
procedure Run;
end;
Esa clase no sabe nada de que se la va a guadar en una BD para que sea persistente. Eso quiere decir que tu clase es testeable sin depender de ninguna BD. Podes probar que tanto las propiedades Name, como Age, como el metodo Run funcionan bien usando Unit Testing.
Luego, para levantarlo de una BD, harias algo como esto
Código Delphi
[-]
function GetDog(const DogId: Integer): TDog;
begin
Result := TDog.Create;
OpenQuery('SELECT [Campos] from Dogs');
Result.Name := Query.FieldByName('Name');
Result.Age := Query.FieldByName('Age');
end;
Tambien es posible que crees otra clase, como comenta Mario, que no tenga ningun metodo, simplemente los campos que mapea de la BD. Entonces, para crear un Dog, podrias tener un constructor que recibe como parametro una instancia del TDatabaseDog de donde tomar el Name y el Age
El tema es bastante complejo pero siempre me gusta este tipo de debates
