菜鸟级问题 (20分)

  • 主题发起人 主题发起人 huddle
  • 开始时间 开始时间
H

huddle

Unregistered / Unconfirmed
GUEST, unregistred user!
我试着做一个从TBDEDATABASE继承来的控件,
其实很简单,只是想改一下它几项属性的默认值,
我就在create()事件里加了几句话,可是并不起作用。
编译时出现警告:dbora7.pas(16): Method 'Create' hides virtual method of base type 'TDatabase'
问题应该说明白了吧,请指点一下。谢谢
代码如下:
代码:
unit dbora7;

interface

uses
  Windows, Messages, SysUtils, Classes, DB, DBTables;

type
  tdbora7 = class(TDatabase)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor create();
  published
    { Published declarations }
  end;

procedure Register;

implementation

constructor tdbora7.create();
begin
  inherited
  aliasname:='oracle7';
  Params.Add('USER NAME=zbh');
  Params.Add('PASSWORD=zbh');
end;

procedure Register;
begin
  RegisterComponents('BDE', [tdbora7]);
end;

end.
 
ps:在构造器create()里加inherited有什么作用,谢谢。
 
函数原型好象应该如下:
constructor Create(AOwner: TComponent);

inherited:执行父类的同名过程,进行默认处理。

后面加上 virtual;试试呢?
 
inherited,是指在你加如的程序执行完后,在执行DELPHI中原有的程序代码,进行默认处理!
 
存在以几问题:
1、构造函数原形不一致。
2、没有在构造函数声明中加override
3、如果需要重新定义构造函数原形(不推荐)请做以下工作:
A、可以任何方式声明你的构造函数原型,不要override;如果要使该对象的派生
类能重载该函数,请加virtual。
B、请在Contructor实现部分开头执inherited执行完整的父类构造函数,
如inherited Create(Self),否则父类的构造函数不会被执行。
C、重新定义构造函数后编译时可能会有些警告,但可以被正确执行。
 
to 小隐:恕我浅薄,你说的有些看不明白。
第2条说要在构造函数加override,后面又说不要override,是怎么回事?
如果在构造函数后加override,编译通过不过。
谢了
 
在原型声明后加上 reintroduce; 指令。
 
前两条是指你只重载你类的构造函数而不更改父类构造原形,后面说的是如果你有必要改
变其构造原形的情况下的处理方法。
“如果在构造函数后加override,编译通过不过”:其它原因有以下:
1、你继承的父类没有定义构造原形,由编辑器自动构造,如TObject,
所以你不能override,这种情况你可以任意建立其构造原形,不必override,
也不必inherited。
2、其父类的构造原形没有加Virtual,这种情况你可以重新指定其构造原形,但必须在
实现部分执行inherited……。比父类的构造如下:
Constructor Create(AOwner : TComponent)
你在实现部分应该这样执行:
inherited Create(这是里组件的拥有者)
而不能仅执行一个 inherited;
 
谢谢,结束讨论
 
后退
顶部