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

Luc*_*fen 4 delphi inheritance

前几天我看到了这样的代码:

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);
Run Code Online (Sandbox Code Playgroud)

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

这个叫什么?

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

Rob*_*edy 9

示例代码不符合您的想法.你看到TMycxGridDBTableView被定义为后代TcxGridDBTableView,然后你看TcxGridDBTableView,被定义为的后代TcxGridDBTableView.

但是,TcxGridDBTableView您在顶部看到的与TcxGridDBTableView您稍后看到的不同.第一个是指在别处宣布的类,在其他一些单元中.下一个例子是声明单元中的类恰好具有与其他单元类相同的基本名称.

这种技术被称为插入类.它用于引入一个新GetViewDataClass方法,但最终仍然使用相同的类名.使用具有该名称的控件的表单将使用该类的新版本而不是原始版本.这是一种自定义VCL控件的方法,无需编译和安装自定义包.


Rud*_*uis 6

你展示的不是循环继承.发生的事情可能是dxSample.TMycxGridDBTableViewTcxGridDBTableView另一个单位继承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);
Run Code Online (Sandbox Code Playgroud)

所以层次结构是:

cxGridDBTableView.TcxGridDBTableView
                 |
                 v
   dxSample.TMycxGridDBTableView
                 |
                 v
    dxSample.TcxGridDBTableView 
Run Code Online (Sandbox Code Playgroud)

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

现在,如果有人把单位dxSample后,cxridDBTableView他或她的uses条款,则dxSample.TCxGridDBTableView是用来代替原来的DevEx类.这被称为插入.

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

type
  TVCLClass = class(OriginalVCLUnit.TVCLClass)
    // modifications to the original TVCLClass
  end;
Run Code Online (Sandbox Code Playgroud)

要么

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

  TVCLClass = class(TMyVCLCLass);
Run Code Online (Sandbox Code Playgroud)

你展示的代码是后者.