On 11/02/2016 17:13 μμ, Graeme Geldenhuys wrote:
Hi,

In TPersistent, we have two virtual methods. Assign() which calls
AssignTo().

1) Why are they both virtual? It seems like Assign() is what I call a
template method, farming its work out to other helper methods - in this
case, AssignTo(). Normally template methods are not virtual, but their
helper methods (the ones doing the actual work) are. So again, why is
Assign() virtual?

Different functionality you need both of them for different reasons see below.

2) Now seeing that both are virtual, and that is probably not going to
change in the RTL, which method is the preferred method to override so
you have the ability to do MyObject.Assign(MySource)? I've been
overriding Assign(), but thinking that maybe I should have overridden
AssignTo() instead.


As a rule of thumb you always override Assign to make sure that your control can copy data from any other. You only override AssignTo to enable 3rd party controls to copy data from your controls.

Lets assume that you right a control TDBGrid based on VirtualstringTree ee
TMyDbGrid = class(TVirtualStringTree)
.
.
.
end;
By overriding the assign method you teach TMyDBGrid how to copy data from a TDBGrid. Now lets assume that you want to be able to copy data from your TMyDBGrid to TDBGrid as well you have two choices
1) create a new control
  TNewDBGrid = class(TDBGrid)
  end;
 and override the assign method
2) override the AssignTo method of TMyDBgrid control and there copy the data to TDBGrid your self with out touching TDBgrid.

This is a simple but powerful feature that allows you to teach other controls how to copy data from your controls with out the need to change their code. Something common on well written libraries.

PS. The choice of the example control is not random, I came to understand the importance of AssignTo when I coded my own dbgrid and wanted to be able to assign data to multiple other grids including the DevExpress grids.

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to