加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

这个在Delphi中调用的“循环继承”是什么?

发布时间:2020-12-15 09:42:15 所属栏目:大数据 来源:网络整理
导读:前几天我看到了这样的代码: type TcxGridTableControllerAccess = class (TcxGridTableController); TMycxGridDBTableView = class (TcxGridDBTableView) protected function GetViewDataClass: TcxCustomGridViewDataClass; override; end; TMycxGridViewD
前几天我看到了这样的代码:

type
    TcxGridTableControllerAccess = class (TcxGridTableController);

    TMycxGridDBTableView = class (TcxGridDBTableView)
    protected
        function GetViewDataClass: TcxCustomGridViewDataClass; override;
    end;

    TMycxGridViewData = class (TcxGridViewData)
    protected
        function GetFilterRowClass: TcxGridFilterRowClass; override;
    end;

    TMycxGridFilterRow = class (TcxGridFilterRow)
    protected
        procedure SetValue(Index: Integer; const Value: Variant); override;
    end;

    TcxGridDBTableView = class (TMycxGridDBTableView);

TMycxGridDBTableView继承自继承自TMycxGridDBTableView的TcxGridDBTableView.搜索循环继承但仅搜索Java结果.

这个叫什么?

Ps:我没有完整的可构建代码.

解决方法

你展示的不是循环继承.发生的事情是dxSample.TMycxGridDBTableView继承自另一个单元中的TcxGridDBTableView,可能是cxGridDBTableView.TcxGridDBTableView.并且dxSample.TcxGridDBtableView继承自dxSample.TMycxGridDBTableView.

您的代码相当于:

type
  TcxGridTableControllerAccess = class(TcxGridTableController);

  { Note: this does NOT inherit from the TcxGridDBTableView defined  }
  { a little further on in the source. It inherits from the original }
  { DevEx TcxGridDBTableView.                                        }

  TMycxGridDBTableView = class(cxGridDBTableView.TcxGridDBTableView)
  protected
    function GetViewDataClass: TcxCustomGridViewDataClass; override;
  end;

  TMycxGridViewData = class(TcxGridViewData)
  protected
    function GetFilterRowClass: TcxGridFilterRowClass; override;
   end;

  TMycxGridFilterRow = class(TcxGridFilterRow)
  protected
    procedure SetValue(Index: Integer; const Value: Variant); override;
  end;

  TcxGridDBTableView = class(TMycxGridDBTableView);

所以层次结构是:

cxGridDBTableView.TcxGridDBTableView
                 |
                 v
   dxSample.TMycxGridDBTableView
                 |
                 v
    dxSample.TcxGridDBTableView

所以dxSample.TMycxGrdiDBTableView不是从dxSample.TcxGridDBTableView继承,而是从cxGridDBTableView.TcxGridDBTableView继承而来,所以那里没有所谓的循环继承.整个误解来自于这样一个事实:不同单元中的两个类具有相同的名称,并且第一个声明不完全限定它继承的类.

现在,如果有人将cxridDBTableView之后的单元dxSample放入他或她的uses子句中,则使用dxSample.TCxGridDBTableView,而不是原始的DevEx类.这被称为插入.

当人们想要修改VCL和FireMonkey的行为时,看到内插器类就像是一样

type
  TVCLClass = class(OriginalVCLUnit.TVCLClass)
    // modifications to the original TVCLClass
  end;

要么

type
  TMyVCLClass = class(OriginalVCLUnit.TVCLClass)
    //
  end;

  TVCLClass = class(TMyVCLCLass);

你展示的代码是后者.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读