◆在子类中覆盖(override)父类中的虚方法(virtual)时,是否可以替换父方法中的某些语句?或将自己的语句插入到父方法的语句序列中而形成自己的方法?在覆盖父方法时常用到的inherited都做了哪些工作?
在子类中覆盖(override)父类中的虚方法(virtual)时,是否可以替换父方法中的某些语句?或将自己的语句插入到父方法的语句序列中而形成自己的方法?

解决方案 »

  1.   

    不可以.inherited 是执行父类的方法.当然你也可以不执行.
      

  2.   

    ◆◆◆to:madyak(无天)
    能不能说具体点“子类中通过覆盖或改写继承的方法或函数来实现” 覆盖能做到替换父方法中的某些语句吗?
    另外如果我没有父类的源代码怎么办?也就是说如果我没有父类方法的源代码,只知道他执行了某些代码,并想替换他,如何能做到??
      

  3.   

    不用inherited 
    而是直接把父类是的代码COPY下来加入你自己的语句形成新的序列.
    但是感觉没有这种必要,如果真的要这样才能完成工作,说明你的设计工作没做好
      

  4.   

    把Inherited屏蔽了,要不就放到后边执行。修改父类好像是不可能的。用汇编应该能行,不过有汇编的工夫,自己写一个了,^_^。
      

  5.   

    意思是这样
    constructor TMyForm.Create(AOwner: TComponent);
    begin
      inherited;
      //下在不要直接写代码指令,而要用过程或函数,这些过程和函数是虚拟得,在子类中覆盖这里的过程或函数来达到目的。不知我是否说明白了
    end;
      

  6.   

    ◆◆◆不过我觉得如果Delphi能加个关键字或函数什么的,并由编译器支持子类修改父类中方法细节的功能是不是会更好更方便呢?大家说?
      

  7.   

    覆盖(override)顾名思义就是将父类的方法接口遮住了,用自己的方法代替了,但是为了利用父类的代码重用性,可以用inherited;关键字来重用父类的代码,当然,你也可以不用,那么你的方法就是一个全新的方法,与父类那个方法没有任何关系了,虽然他们名字相同。
    下面给你一个例子,也许能够帮助你理解
    //////////////////////////////////////
    TParent = class
      public
        Key:boolean;
        procedure a;virtual;
      end;
      TChild = Class(TParent)
      public
        procedure a;override;
      end;var
      Form1: TForm1;implementation
    var a:TChild;{$R *.dfm}{ TParent }procedure TParent.a;
    begin
        showmessage('Parent');
    end;{ TChild }procedure TChild.a;
    begin
        if Key then inherited
        else showmessage('Child');
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
        a.Key:=Not(a.Key);
        a.a;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
        a:=TChild.Create;
    end;end.
      

  8.   

    ◆◆◆To:yuanscar(塑料树)
    可是父类又不是我写的,另外我也没有父类的源代码!看来我的这个问题的答案是否定的!
    不过我觉得如果Delphi能加个关键字或函数什么的,并由编译器支持子类修改父类中方法细节的功能是不是会更好更方便呢?大家说?
      

  9.   

    http://community.csdn.net/Expert/topic/3808/3808741.xml?temp=.1342737http://community.csdn.net/Expert/topic/4077/4077204.xml?temp=.6157801
      

  10.   

    http://community.csdn.net/Expert/topic/3808/3808741.xml?temp=.1342737http://community.csdn.net/Expert/topic/4077/4077204.xml?temp=.6157801