TList与TObjectlist之间的区别。

TList(Classes.pas)

TObjectList(Contnrs.pas)

TObjectList:    constructor Create; overload;
                constructor Create(AOwnsObjects: Boolean); overload;

If the OwnsObjects property is set to true (the default), TObjectList controls the memory of its objects, freeing an object when its index is reassigned; when it is removed from the list with the Delete, Remove, or Clear method; or when the TObjectList instance is itself destroyed.

3种情况下,其自动释放自己的内存。1.该对象实例的索引被重新分配。2.使用D、R、C三种方法从列表中删除时。3.整体被销毁时。

TObjectList = class(TList)
...
public
    constructor Create; overload;
    constructor Create(AOwnsObjects: Boolean); overload;
    function Add(AObject: TObject): Integer;
    function Remove(AObject: TObject): Integer;
    function IndexOf(AObject: TObject): Integer;
    function FindInstanceOf(AClass: TClass; AExact: Boolean=True;
AStartAt:Integer=0):Integer;
    procedure Insert(Index: Integer; AObject: TObject);
    property OwnsObjects: Boolean;
    property Items[Index: Integer]: TObject; default
end;

Object Slicing

       这个对象将被”分割”成只剩下与目的类型(即:转换以后的类型)相匹配的子对象(即:成员变量和函数)
这句话的意思也就是说:在函数传参处理多态性时,如果一个派生类对象在UpCasting时,用的是传值的方式,而不是指针和引用,那么,这个派生类对象在UpCasting以后,将会被slice(切分)成基类对象,也就是说,派生类中独有的成员变量和方法都被slice掉了,值剩下和基类相同的成员变量和属性。这个派生类对象被切成了一个基类对象。

它虚就虚在所谓“推迟联编”或者“动态联编”上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。
虚函数只能借助于指针或者引用来达到多态的效果。

纯虚函数

 纯虚函数是在基类中声明的虚函数它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”
 

 virtual void funtion1()=0

基类本身生成对象是不合情理的。引入了纯虚函数的概念。

virtual ReturnType Function()= 0;

TComponentList

TComponentList = class(TObjectList)
...
public
    function Add(AComponent: TComponent): Integer;
    function Remove(AComponent: TComponent): Integer;
    function IndexOf(AComponent: TComponent): Integer;
    procedure Insert(Index: Integer; AComponent: TComponent);
    property Items[Index: Integer]: TComponent; default;
end;

 

你可能感兴趣的:(Delphi)