Delphi中的构造方法,可以加override关键字,也可以不加,请问有什么区别吗? 
可不可以加overload关键字呢,又有什么区别呢?
谢谢!!!

解决方案 »

  1.   

    可以去看一下面象对象思想那一本书,重载(overload)和覆盖(override)的方法
      

  2.   

    重载(overload)和覆盖(override),重点理解两者区别,以后才好方便使用。1.
    父类:public virtual string ToString(){return "a";}
    子类:public override string ToString(){return "b";}
    2.
    同一类中或父子关系类中皆可:
    public string ToString(){return "a";}
    public string ToString(int id){return id.ToString();}override是用于重写基类的虚方法,这样在派生类中提供一个新的方法重载是提供了一种机制, 相同函数名通过不同的返回值类型以及参数来表来区分的机制===============================================
    很本质的区别就是看函数特征:覆写(Override)的两个函数的函数特征相同,重载(Overload)的两个函数的函数名虽然相同,但函数特征不同。 
    函数特征包括函数名,参数的类型和个数。 
    Override 是在继承的时候,如果你写的函数与要继承的函数函数特征相同,那么,加上这个关键字,在使用这个子类的这个函数的时候就看不见父类(或超类)的函数了,它被覆盖掉了。 
    比如:Derived继承了Base,Base里面有void A(int a) 
    那么如果你Derived里面觉得A写得不好或不适合这个类,你想重新再写一遍A里的代码,那么就写override void A(int a)这样,原来的那个函数就被你新写的这个覆盖掉了。 
    Overload 是重载,就是说函数名相同,函数特征不同,系统会根据你提供的参数来调相应的函数。 
    比如:void A(int a)和void A(int a,int b) 
    如果你用的是A(1)那么调的是第一个,如果是A(1,1)那么调的是第二个。
    =================================================1. override
    -----------
    使用 override 修饰符来修改方法、属性、索引器或事件。重写方法提供从基类继承的成员的新实现。由重写声明重写的方法称为重写基方法。重写基方法必须与重写方法具有相同的签名。不能重写非虚方法或静态方法。重写基方法必须是虚拟的、抽象的或重写的。也就是说,用 override 修饰符重写的基类中的方法必须是 virtual, abstract 或 override 方法。2. 重载
    -------
    当类包含两个名称相同但签名不同的方法时发生方法重载。使用重载方法的指南:
    a. 用方法重载来提供在语义上完成相同功能的不同方法。
    b. 使用方法重载而不是允许默认参数。默认参数的版本控制性能不好,因此公共语言规范(CLS)中不允许使用默认参数。
    c. 正确使用默认值。在一个重载方法系列中,复杂方法应当使用参数名来指示从简单方法中假定的默认状态发生的更改。
    d. 对方法参数使用一致的排序和命名模式。提供一组重载方法,这组重载方法带有递增数目的参数,以使开发人员可以指定想要的级别的信息,这种情况很常见。您指定的参数越多,开发人员就可指定得越详细。
    e. 如果必须提供重写方法的能力,请仅使最完整的重载是虚拟的并根据它来定义其他操作。
    // 下面具体解释一下这种模式,只有最后一个方法(参数最完整的方法)是虚方法,在继承了这个类的子类中只要重写(override)这个方法就行了。public class SampleClass
    {
       private string myString;   public MyClass(string str)
       {
          this.myString = str;
       }   public int IndexOf(string s)
       {
          return IndexOf (s, 0);
       }   public int IndexOf(string s, int startIndex)
       {
          return IndexOf(s, startIndex, myString.Length - startIndex );
       }   public virtual int IndexOf(string s, int startIndex, int count)
       {
          return myString.IndexOf(s, startIndex, count);
       }
    } 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zengjibing/archive/2009/02/21/3916343.aspx
      

  3.   

    谢谢各位上面的回答,普通方法的override,overload的区别我是知道的,我现在问的是构造方法的override,overload的作用,它也和普通方法一样吗?构造方法可以被继承吗?像其他的语言就没有这样一说,没有构造方法可以被继承,被override,比如java,C#
      

  4.   


    @@;;
    这是Delphi 的代码吗??
      

  5.   


    TComponent = class(TPersistent, IInterface, IInterfaceComponentReference)
    public
      constructor Create(AOwner: TComponent); virtual;
    end;constructor TComponent.Create(AOwner: TComponent);
    begin
      FComponentStyle := [csInheritable];
      if AOwner <> nil then AOwner.InsertComponent(Self);
    end;TControl = class(TComponent)
    public
      constructor Create(AOwner: TComponent); override;
    end;
    constructor TControl.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FWindowProc := WndProc;
      FControlStyle := [csCaptureMouse, csClickEvents, csSetCaption, csDoubleClicks];
      FFont := TFont.Create;
      FFont.OnChange := FontChanged;
      FAnchors := [akLeft, akTop];
      FConstraints := TSizeConstraints.Create(Self);
      FConstraints.OnChange := DoConstraintsChange;
      FColor := clWindow;
      FVisible := True;
      FEnabled := True;
      FParentFont := True;
      FParentColor := True;
      FParentShowHint := True;
      FParentBiDiMode := True;
      FIsControl := False;
      FDragCursor := crDrag;
      FFloatingDockSiteClass := TCustomDockForm;
      FHelpType := htContext;
    end;
      

  6.   

    一样,构造方法可以被继承,也可以重载
    constructor Create(Aowner:TComponent) 
    begin
      inherited Create;
    end;
    重载兄弟是知道的,那么就不多说了,和普通的是一样的。
      

  7.   

    首先,你要清楚,override这个关键字的含义,他仅仅是在说,被这个函数所修饰的函数或者过程,是要重载祖先类的同名方法。只有祖先类中使用了virtual方法声明的函数或者过程才能够在子类中使用override的方式重载。
    这个从你的回复上看,你应该是清楚地。
    现在再来说说构造函数。
    要说清楚这个问题,那就得先说说TObject和TComponent两个类。
    看看TObject的构造函数
      TObject = class
        constructor Create;
    看到没有,他不是一个虚函数,仅仅是使用constructor 关键字修饰的一个普通函数。
    再看看TComponent类
        constructor Create(AOwner: TComponent); virtual;
    看到没有,从TComponent开始,构造函数才是虚函数,也因此,所有继承自TComponent的类,必须使用override的方式重载构造函数才行,否则,就不是重载而是同名函数了(同名函数如果不使用virtual和override,子类会覆盖祖先类的同名函数,也就没有那种多态的效果了)。这就是为什么有的时候构造函数要用override,有的时候却不需要的原因,因为他们继承的基类是不一样的。好了,再说overload,这个关键字和继承以及类没有任何关系,他紧紧是作为在一个单元中定义同名但是参数列表不一样的函数的时候必须指明的一个关键字,不论这些同名函数是否是在类中还是不在类中。当然了,在类中,必须是在一个类中定义了同名函数才需要使用overload,在不同类中或者类中函数和普通函数同名是没有关系的,不需要使用overload。
    overload紧紧是一个定义同名不同参数的函数的一个关键字,其意义就在于告诉编译器,这些函数是同名的,编译的时候需要特殊处理一下。而override是出现在继承体系中用来重载祖先类的虚方法的关键字,override和overload这两个关键字没有可比性,完全是两个不同的东西,要硬说相同点,估计是被这两个关键字约束的函数他们和其他与之有关的函数都是有一样的名字。仅此而已。在强调一遍:当你要定义同名但是不同参数列表的函数的时候,使用overload
    而你要重载祖先类的虚方法,使用override
      

  8.   

    再补充一下,是否使用override,和函数是否是构造函数没有关系,主要看祖先类在定义这个函数的时候是否使用了virtual,也就是祖先类中的整个函数是否是虚函数,如果是,你要重载,那就需要override,如果不是,那就不需要。而你所说的,其他的语言构造函数有些不能是虚函数什么的,这是语言特性决定的,delphi中,就允许将构造函数定义成虚函数,来无中生有地弄出一个对象实例来,哈哈,这就是delphi的妙处了。