sé que puedo definir métodos getter y setter para conseguir o para salvar la propiedad, respectivamente, pero que es posible incluso sin la variable de ser una "propiedad".
Bueno, no. Setters y getters son solo métodos normales que se llaman como tales solo una vez que se utilizan como miembros de lectura y escritura de una propiedad. No tener una propiedad significa no tener un getter o un setter, incluso si se nombran como tales. Además; los setters y getters generalmente se declaran privados o protegidos. Por lo tanto, poder llamarlos cuando usa un campo público en lugar de usar una propiedad pública requeriría mover esos métodos a la sección pública.
Además, una gran diferencia entre los campos y las propiedades es la posibilidad de ser publicado y, por lo tanto, se puede utilizar en el inspector de objetos. Los campos (de otros tipos, luego clase o interfaz) no se pueden declarar como publicados.
Las propiedades también pueden ser de gran importancia, o ser útiles, en la herencia. Técnicamente, no puede anular una propiedad, pero puede imitar la anulación de varias maneras. Algunos ejemplos en los que la propiedad Name se puede llamar desde TDescendant, cada uno con su propio propósito:
1) Abstracción:
TBase = class(TObject)
protected
function GetName: String; virtual; abstract;
procedure SetName(const Value: String); virtual; abstract;
public
property Name: String read GetName write SetName;
end;
TDescendant = class(TBase)
private
FName: String;
protected
function GetName: String; override;
procedure SetName(const Value: String); override;
end;
2a) Protección (como Krom mencionado,):
TBase = class(TObject)
private
FName: String;
function GetName: String;
procedure SetName(const Value: String);
protected
property Name: String read GetName write SetName;
end;
TDescendant = class(TBase)
public
property Name;
end;
2b)
TBase = class(TObject)
private
FName: String;
protected
function GetName: String;
procedure SetName(const Value: String);
end;
TDescendant = class(TBase)
public
property Name: String read GetName write SetName;
end;
Por combinination de la anterior, puede chang e el comportamiento de las propiedades para las clases descendientes.
Magicmaster - Debo perderme algo aquí; ¿Puedes explicar cómo definirías un getter y un setter para tu ejemplo TSampleClass.SomeInfo, y de hecho harías que se invoquen esos métodos cuando asignes un valor o leas el valor de la variable SomeInfo? – Stuart
Consulte esta pregunta: http://stackoverflow.com/q/3963874/267938 –