代码之家  ›  专栏  ›  技术社区  ›  zeus

合理化事实上非常相似的不同实现

  •  0
  • zeus  · 技术社区  · 3 年前

    我有几个类似的函数:

    TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;
    
    procedure TStringList.QuickSort(L, R: Integer; SCompare: TStringListSortCompare);
    begin
      ..
      SCompare(Self, I, P);
      ... 
    end;
    

    TMyStringListSortCompare = function(List: TMyStringList; Index1, Index2: Integer): Integer;
    
    procedure TMyStringList.QuickSort(L, R: Integer; SCompare: TMyStringListSortCompare);
    begin
      ..
      SCompare(Self, I, P);
      ... 
    end;
    

    等。。。

    所有这些快速排序实现都是 完全一样 . 只有param SCompare不同(例如: TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer; TStringList公司 TMyStringListSortCompare = function(List: TMyStringList; Index1, Index2: Integer): Integer; 对于 t系统列表

    我正在寻找一个“窍门”使我的快速排序函数成为一个全局函数,并使所有 TStringList.QuickSort , TMyStringList.QuickSort

    注意:一切从阅读这个错误报告开始: https://quality.embarcadero.com/browse/RSP-19551

    0 回复  |  直到 3 年前
        1
  •  1
  •   Bosshoss    3 年前

    TStringList )可以使用基类进行比较。

    否则,您可以像那样使用泛型,并执行不同的实现:

    TCustomQuickSort<T> = class
      class function Sort(L, R: integer): integer;
    end;
    

    并称之为:

    TCustomQuickSort<TMyStringListSortCompare>.Sort(i, j);
    

    为了使代码接近修改但开放以进行扩展,可以使用工厂设计模式来获取所需的排序对象。如果明天你有 TSuperListSortCompare

    您也可以通过替换 SCompare 按类型 ISortableObject Sort 方法。