esse papo de "quem dá mais" não é comigo. :)
Veja, em meu ponto de vista, seu primeiro exemplo é melhor, pois abstrai a funcionalidade agregando-a no mesmo objeto (o objeto principal), enquanto que no segundo exemplo você acaba ficando com três variáveis diferentes, mas de de alguma forma se relacionam.
Além disso, eu não criaria o objeto principal baseado em Empty. Ao invés disso, também criaria uma classe para ele, e no Init, por exemplo, criaria os outros objetos. Assim, no seu Main.prg, bastaria instanciar o objeto principal, e todos os outros objetos já estariam agregados; assim como colocou em seu terceiro exemplo.
Também acho o terceiro exemplo mais interessante pois te da muito mais controle no objeto principal, onde você poderia ter métodos para comunicar-se com os objetos e propriedades contidos dentro dele. ;)
Claudio Lassala