Właściwość klasy (ang. class property) – specjalny składnik klas w niektórych obiektowych językach programowania, posiadający cechy pola i metody. Właściwości są odczytywane i zapisywane tak jak pola, ale ich odczytywanie i zapisywanie zazwyczaj przebiega poprzez wywołanie metod. Łatwiej jest czytać i zapisywać pola, niż wywoływać metody, jednak wstawienie poprzez wywołanie metody pozwala sprawdzić poprawność danych, aktywować kod aktualizacji (np. wygląd elementów GUI). Oznacza to, że właściwości mają cechy pośrednie pomiędzy ciągiem instrukcji (metoda) a danymi (pole) klasy i zapewniają wyższy poziom hermetyzacji niż publiczne pola.
Języki programowania używające właściwości
Języki programowania, które zapewniają wsparcie dla właściwości to: Object Pascal (Delphi/Free Pascal), Visual Basic, C#, D, F #, Objective-C 2.0, JavaScript, Swift, Python i Vala. W tych językach właściwości związane są z obecnością w klasie pary metod dostępowych: odczytującą (ang. getter) i zapisującą (ang. setter). Metody dostępowe są na ogół prywatne (ang. private) lub chronione (ang. protected). Jest tak na przykład w językach: C# i Object Pascal. W innych metody te są publiczne (np. Python, ponieważ ten język nie wspiera hermetyzacji). Pominięcie metody zapisującej czyni właściwość tylko do odczytu. Pominięcie metody odczytującej czyni właściwość tylko do zapisu. Właściwości tylko do zapisu są rzadkością z uwagi na ich małą użyteczność. Możliwe są również przypadki, gdy właściwości nie odpowiada żadne pole w klasie, a odczytywana wartość jest uzyskiwana jako wynik działania metody odczytującej (np. jako wynik obliczeń). Właściwości mogą być typu prostego (np. liczba całkowita, liczba rzeczywista, ciąg znaków, wartość boolowska) lub złożonego (np. tablica, struktura, obiekt). Właściwości tablicowe wymagają podania numeru komórki (indeksu), który jest przekazywany jako jeden z argumentów metody dostępowej (odczytującej lub zapisującej).
Niektóre języki obiektowe, takie jak Java, nie obsługują właściwości, co wymaga od programisty bezpośredniego posługiwania się metodami dostępowymi: odczytującą i zapisującą.
Przykładowy kod w języku Object Pascal
type
TPen = class
private
FColor: Integer;
FWidth: Integer;
function GetColor: Integer;
procedure SetColor(Value: Integer);
procedure SetWidth(Value: Integer);
public
property Color: Integer read GetColor write SetColor;
property Width: Integer read FWidth write SetWidth;
end;
function TPen.GetColor: Integer;
begin
Result := FColor;
end;
procedure TPen.SetColor(Value: Integer);
begin
if FColor <> Value
then FColor := Value;
end;
procedure TPen.SetWidth(Value: Integer);
begin
if Value > 2
then FWidth := Value
else FWidth := 3;
end;
// zastosowanie
var Pen: TPen;
// ...
Pen.Color := not Pen.Color;
Pen.Width := 10;
// ...
Przykładowy kod w języku C#
Składnia właściwości klasy wygląda następująco:
<modyfikator_dostepu> <typ> nazwa
{
get
{
// implementacja
}
set
{
// implementacja
}
}
using System;
class Person
{
private string lastname;
private string firstname;
public string Lastname
{
get
{
return lastname;
}
set
{
this.lastname = value; // słowo kluczowe value jest używane w odniesieniu do wartości przekazanej do set
}
}
public string Firstname
{
get
{
return firstname;
}
set
{
this.firstname = value;
}
}
}
class Program
{
public static void Main(string[] args)
{
Person person = new Person();
// ustawiamy wartości prywatnych pól klasy przy użyciu właściwości
person.Lastname = "Kowalski";
person.Firstname = "Jan";
Console.WriteLine("Nazywam się " + person.Firstname + " " + person.Lastname); // pobieramy wartość prywatnych pól klasy za pomocą właściwości
}
}