我写一个类从TImage派生,想增加一个构造器,参数列表与TImage的不同,如何办?
type
  TCard= class(TImage)
  public
     constructor Create(Suit: Integer; Number:Integer; Parent:TWinControl) ;
  ...这样的话编译时会出“Method 'Create' hides virtual method of base type 'TImage'”的警告信息,而且在建立后访问TImage的成员如Left,Top时就出访问冲突的错误。而在Create声明后面加override也不行。哪位有这方面的经验,介绍一下好不。以前在C++中可爽多了,参数列表的两个方法自动认为是不同的。

解决方案 »

  1.   

    constructor Create(Suit: Integer; Number:Integer; Parent:TWinControl) ;reintroduce;/////////////
      

  2.   

    用上面的方法也不行,它只是隐藏了那条警告信息而已。 在自己的构造器中访问对象的Left等属性还是出访问冲突,这是怎么回事?
      我想在我自己的构造器中先调用TImage的构造器,再附加一些处理,怎么办?我用的下述方法出访问冲突
    constructor Create(Suit: Integer; Number:Integer; Parent:TWinControl) ;
    begin
      TImage.Create(nil);  //自行进行资源释放,不使用Owner
      FSuit:= Suit;
      FNumber:=Number;    //FSuit和FNumber为派生类中添加的字段
      Left:= 5;  //此句出访问冲突,Why?
      //.......
    end;
      

  3.   

    用上面的方法也不行,它只是隐藏了那条警告信息而已。 在自己的构造器中访问对象的Left等属性还是出访问冲突,这是怎么回事?
      我想在我自己的构造器中先调用TImage的构造器,再附加一些处理,怎么办?我用的下述方法出访问冲突
    constructor Create(Suit: Integer; Number:Integer; Parent:TWinControl) ;
    begin
      TImage.Create(nil);  //自行进行资源释放,不使用Owner
      FSuit:= Suit;
      FNumber:=Number;    //FSuit和FNumber为派生类中添加的字段
      Left:= 5;  //此句出访问冲突,Why?
      //.......
    end;
      

  4.   

    constructor Create(Suit: Integer; Number:Integer;   
            Parent:TWinControl) ;reintroduce;overload;
      

  5.   

    constructor Create(Suit: Integer; Number:Integer;   
            Parent:TWinControl) ;reintroduce;override;
    begin
    inherited;
    //......
    end;
      

  6.   

    上面的错了。抱歉。
    下面这样用(原形可能不正确)
    constructor Create(Suit: Integer; Number:Integer;   
            Parent:TWinControl) ;override;
    begin
    inherited;
    //......
    end;
      

  7.   

    Parent是什么?如果是另外的constructor Create(Owner: TComponent; Suit: Integer; Number:Integer; Parent:TWinControl) ; reintroduce;
    constructor TCard.Create(Owner: TComponent; Suit: Integer; Number:Integer; Parent:TWinControl) ; 
    begin
      inherited Create(Owner);
    end;
      

  8.   

    constructor Create(Suit: Integer; Number:Integer; Parent:TWinControl) ;
    begin  
      inherited create(Parent);//////////////////////////////important!  TImage.Create(nil);  //自行进行资源释放,不使用Owner
      FSuit:= Suit;
      FNumber:=Number;    //FSuit和FNumber为派生类中添加的字段
      Left:= 5;  ////////OK!
      //.......
    end;
      

  9.   

    type
      TCard= class(TImage)
      public
         constructor Create(Suit: Integer; Number:Integer; Parent:TWinControl);reintroduce;
      ...//reintroduce 是正确的,你确实引入了一个新的构造器!!
    //但你可能还是需要继承基类的构造器的行为,因此在实现构造器的时候,调用 inherited Create()TCard.Create(Suit: Integer; Number:Integer; Parent:TWinControl);
    begin
      inherited Create(nil);//按理说,你少了一个 AOwner:TComponent 参数,只能传 nil 了,即没有 Owner。
     ...
    end;