Type
  //基类,根据需要继承自TObject或TPersistent或其它基类,没有弄清楚
  Base=Class
  public
    Load();
  end;  C1=Class(Base)
  public
    load();
  end;
  
  C2=Class(Base)
  public
    load();
  end;定义了三个类,其中一个是其它类的基类,我现在需要创建这些类中的对象实例,但具体创建哪个类的实例是根据参数来的。
并且要求创建的对象在使用Load()函数时,调用的是相应类的Load函数,而不是基类的Load函数。求各达人帮忙给个解

解决方案 »

  1.   

    你的参数是如何确定的,类的实例固定了,那么他所包含的方法也就固定了。
    Base=Class
      public
        Load(); virtual; abstract;
      end;  C1=Class(Base)
      public
        load(); override;
      end;
     
      C2=Class(Base)
      public
        load(); override;
      end; 假设你的函数如下
    procedure load(Param: integer);
    var
      AClass: Base; 
    begin
      if Param = 1 then
        AClass := C1.Create
      else
        AClass := C2.Create;
      AClass.Load;
    end;
      

  2.   

    1、Load做成虚函数
    2、RegisterClass
    3、FindClass
    4、转型成基类来调用
      

  3.   

    修正procedure load(Param: integer);
    var
      AClass: Base;
    begin
      if Param = 1 then
        AClass := C1.Create
      else
        AClass := C2.Create;
      AClass.Load;
      if AClass <> nil then FreeAndNil(AClass);
    end;
      

  4.   

    如果你使用类名来创建的话,祖先必须从TPersistent来继承,不能从TObject继承。
      

  5.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TBaseClass=class of  TBase;
      TForm1 = class(TForm)
        T1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure T1Click(Sender: TObject);
      private
        { Private declarations }
        procedure CreateObjectByName( const ObjectName : string);
      public
        { Public declarations }
      end;
       TBase = class(TPersistent)
       public
          procedure Load;virtual;
        end;   TC1=class(TBase)
       public
          procedure Load;override;
       end;   TC2=class(TBase)
       public
          procedure Load;override;
       end;
    var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      RegisterClass(TBase);
      RegisterClass(TC1);
      RegisterClass(TC2);
    end;
    { TC2 }procedure TC2.Load;
    begin
      inherited;
       ShowMessage('TC2.Load');
    end;{ TBase }procedure TBase.Load;
    begin
       ShowMessage('TBase.Load');
    end;{ TC1 }procedure TC1.Load;
    begin
      inherited;
      ShowMessage('TC1.Load');
    end;procedure TForm1.CreateObjectByName(
      const ObjectName : string);
    var
      fc : TBaseClass;
      f : TBase;
    begin
      fc := TBaseClass(FindClass(ObjectName));
      f := fc.Create();
      f.Load;
     
    end;
    procedure TForm1.T1Click(Sender: TObject);
    begin
      CreateObjectByName('TC2');
    end;end.
      

  6.   

    对于子类为啥不继承TBASE类中的LOAD,那还继承做什么,不清楚LZ的具体需求,不便瞎说! 
      

  7.   

    对于1楼的解答问题:由于我的类相对较多,可能需要多达上百个,所以使用类似于
    procedure load(Param: integer); 
    var 
      AClass: Base; 
    begin 
      if Param = 1 then 
        AClass := C1.Create 
      else 
        AClass := C2.Create; 
      AClass.Load; 
    end;
    这样的函数是比较难的,因为需要判断的太多了对于2楼的回答,我试了,不知道是不是没有试对,调用的时候还是调用了基类的函数。过程如下:
    将基类中Load函数加上virtual关键字,调试发现结果还是使用的基类函数,将基类中加上virtual;abstract;关键字,结果却直接报错了,消息如下:Project Project1.exe raised exception Class EAbstractError with Message 'Abstract Error'.Process Stopped. Use Step orRun To continue.
    我的转型代码如下
    var
      aIns:Base;
    begin
      aIns:=Base(FindClass('C1').Create);
      Base(aIns).ByteCnt;
    end;
    (RegisterClass我是在单元的initialization段写的)
      

  8.   

    不想继承就把子类的inherited去掉呗!
    另:你创建抽象类肯定会出错的
      

  9.   

    如果你使用类名来创建的话,祖先必须从TPersistent来继承,不能从TObject继承。
    --------------那就改成TPersistent好了,反正没什么关系的。