如题,没有搜索到方法

解决方案 »

  1.   

    record直接 A:=B 就可以浅复制
    object之间没有通用的办法,按照delphi中TPersistent的约定,TPersistent的继承类应继承AssignTo虚方法用来完成object之间数据的复制。同类型object之间的浅复制也可以直接实现,但因为的实现的方式不同,没有通用的清理原有数据的方式,直接复制会造成memory leak
      

  2.   

    浅复制是针对指针的,就是只复制指针,而不是复制一个指针指向的内容。这意味着如果只是浅复制的话,对指针指向内容的。比如下面这个例子:var
      a, b: record
        Count : Integer;
        Buffer: Pointer;
      end;
    begin
      GetMem(a.Buffer, 100);
      a.Count := 100;
      b := a;
    end;这段代码中b就是a的一个浅复制,如果是深复制,则应该给b.Buffer申请一块同样大小的内存并复制过去。对于record来说,一般浅复制没什么大影响,而且Delphi会对string、array进行一定的管理(动态数组更复杂些,虽然直接复制是浅复制,但如果再SetLength的话,就变成另一个复本了)一般不需要担心。但是对object来说问题就大了。比如  TFoo = class
        ...
        FBmp: TBitmap;
        ...
      end;destuctor TFoo.Destroy;
    begin
      ...
      FBmp.Free;
    end;var a, b: TFoo;
    begin
      a := TFoo.Create;
      b := TFoo.Create;
      // 类似 b.* := a.* 的一个浅复制
      b.Free;
      a.Free;
    end;因为b.FBmp=a.FBmp,只是指向内容相同,所以b.Free之后,实例上a.FBmp也已经销毁了。再调用a.Free,由于a.FBmp已经销毁了,试图再销毁就会产生错误。而正确的复制方法是使用b.FBmp.Assign(a.FBmp)进行一个深复制(TBitmap继承了Assign,并在里面实现了深复制)
      

  3.   

    站在领域设计的角度上来说,软件模型有三种核心元素:实体(Entity)、值对象(Value Object)和服务(Service)。在整个软件情景(Context)当中,实体需要保持唯一性,一般只有值对象才可以进行复制。Delphi里面用来表示值对象主要两种方式:
    1. record
    优点:自动管理内存,无需手工释放。可重载操作符。
    缺点:不能继承、无法直接实现接口。
    如:TPointvar
      p1, p2: TPoint;
    begin
      //...
      p1 := p2; // 直接拷贝record数据
    end;2. Object(TPersistent子类)
    优点:能利用OO的特性(继承、多态)
    缺点:无垃圾回收,一般需要手工释放对象实例。不可重载操作符。
    如:TFont
    var
      f1, f2: TFont;
    begin
      // 创建f1, f2
      f1.Assign(f2);
      // 释放f1, f2
    end;