Absolutamente que se puede. Y no, no es algo "magico" de los lenguajes, de hecho Delphi hace PRECISAMENTE eso cuando crea los formularios. El concepto es un patron (pattern) muy usado que se llama el Class Factory.
La explicacion a lo bestia es mas o menos asi:
Un "factory" es una clase de control que en base a un parametro determina la clase a construir"
PD. Si quieres una definicion mejor busca "Factory Pattern" o "Builder Pattern" en google....
Tengo un framework basado en
http://www.devexpress.com/?section=/...ctices/SAP-VCL (si te estudias este articulo vas a entender mejor) que lo he mejorado un poquito
La implementacion es mas o menos:
Código Delphi
[-]
type
TfraBaseModulo = class(TfraBase)
.
.
type
TfraInventarios = class(TfraBaseModulo)
type
TfraGrupos = class(TfraBaseModulo)
type
TAdministradorModulos = class (TInterfacedObject, IColeccion)
.
.
function TAdministradorModulos.RegistrarModulo(const Nombre: string);
var
oInfoModulo: TInfoModulo;
begin
if Modulo='Inventarios'
begin
result:=TfraInventarios.Create(...
end;
if Modulo='Grupos'
begin
result:=TfraGrupos.Create(...
end;
initialization
AdministradorModulos.RegistrarModulo('Inventarios',TfraInventarios...);
function AdministradorModulos: TAdministradorModulos;
begin
if FModuleInfoManager = nil then
begin
FModuleInfoManager := TAdministradorModulos.Create;
end; Result := FModuleInfoManager;
end;
TfraModuloBaseClass = class of TfraBaseModulo;
procedure TAdministradorModulos.RegistrarModulo(const Nombre: string;
ClassModulo: TfraModuloBaseClass....)
oInfoModulo: TInfoModulo;
begin
oInfoModulo := TInfoModulo.Create(Nombre,ClassModulo,ACategoria,ATipoInstancia);
Add(oInfoModulo);
end;
procedure TInfoModulo.CrearModulo(Clase:TfraModuloBaseClass;AOwner:TComponent);
begin
FModulo:=Clase.Create(AOwner);
FModulo.OnDestroy:=DoModuleDestroy;
FModulo.Align := alClient;
end;