Ver Mensaje Individual
  #3  
Antiguo 27-01-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Pues no, realmente esto no se puede. ¿Por qué? Porque Delphi es un lenguaje compilado y no interpretado. ¿Qué quiere decir esto? Pues quien sabe pero el caso es que una vez compilado, en el ejecutable ya no quedan referencias a los nombres de funciones, variables, etc. que hayas usado en el código fuente- sólo instrucciones en ensamblador.

Siempre hay alternativas pero dependen mucho del contexto general. Por ejemplo, suponiendo que SelectA, SelectB y SelectC son parte de un X proceso podrías tener algo como

Código Delphi [-]
type
  TProcesoX = class
  public
    function Select; virtual; abstract;
  end;

  TProcesoA = class(TProcesoX)
  public
    function Select; override;
  end;

  TProcesoB = class(TProcesoX)
  public
    function Select; override;
  end;

  TProcesoC = class(TProcesoX)
  public
    function Select; override;
  end;

Según el proceso específico que estés haciendo, instanciarás una u otra clase en una variable de la clase base TProcesoX, de manera que al llamar a Proceso.Select, el polimorfismo se encargará de escoger el correcto.

Pero esto requiere claro, que hayas estructurado tu aplicación en clases.

De no ser así o no ser factible, puedes optar por dos cosas (entre otras que se le ocurran a alguien más).

La primera es: si sólo hay un punto del programa donde debes decidir cuál función llamar, pues olvídate de complicaciones y haz el case:

Código Delphi [-]
case Status of
  0: SelectA();
  1: SelectB();
  2: SelectC();
end;

Si es algo que llamas desde distintas partes de la aplicación, podrías crearte una clase "selectora":

Código Delphi [-]
type
  TSelector = class
  private
    class function SelectA: Integer;
    class function SelectB: Integer;
    class function SelectC: Integer;
  public
    class function Select(Status: Integer): Integer;
  end;

implementation

function TSelector.Select(Estatus: Integer): Integer;
begin
  case Status of
    0: Result := Self.SelectA();
    1: Result := Self.SelectB();
    2: Result := Self.SelectC();
  end;
end;

La clase sólo tiene métodos estáticos (directiva class) de manera que no hay que crear ninguna instancia, simplemente la usas así:

Código Delphi [-]
TSelector.Select(Status);

Los métodos TSelector.SelectA, TSelector.SelectB y TSelector.SelectC también son estáticos y reemplazarían a los que tenías antes.

O bien los dejas fuera de la clase y dejas a TSelector únicamente con el método Select:

Código Delphi [-]
function TSelector.Select(Estatus: Integer): Integer;
begin
  case Status of
    0: Result := SelectA();
    1: Result := SelectB();
    2: Result := SelectC();
  end;
end;

Pero la primera opción te da un cierto orden al englobar en un sólo ente las tres funciones relacionadas.

// Saludos

Última edición por roman fecha: 27-01-2006 a las 19:25:52.
Responder Con Cita