Zmienne zadeklarowane wewnątrz klasy nazywamy polami. Właściwości są rozszerzeniem dla pól i są dostępne przy użyciu tej
samej składni. Używają one akcesorów, dzięki czemu pola prywatne są dostępne z zewnątrz klasy.
Właściwości nie służą do przechowywania wartości. Przy pomocy acesorów mają dostęp do pól, które reprezentują.
Załóżmy, że mamy zdefiniowaną klasę Car, która ma prywatne pola: marka, model, silnik. Pola te
nie są bezpośrednio dostęp z zewnątrz danej klasy ale używając właściwości możemy uzyskać do nich dostęp.
Akcesory
Akcesor właściwości zawiera instrukcje do wykonania, które pozwalają na odczyt albo zapis wartości pola. Deklaracje właściwości
mogą zawierać akcesor get, set lub oba"
namespace Wlasciwosci
{
class Program
{
static void Main(string[] args)
{
Car car = new Car();
// 'Car.brand' nie jest dostępne z powodu poziomu dostępu
car.brand = "Audi";
// spróbujmy teraz uzyskać dostęp
car.Brand = "Audi";
}
}
class Car
{
// Pola nie są dostępne z zewnątrz
private string brand;
private string model;
private double capacity;
// Deklaracja właściwości Brand z dostępem do pola prywatnego brand
public string Brand
{
get
{
return brand;
}
set
{
brand = value;
}
}
}
}
Przykład zastosowania właściwości:
using System;
namespace Wlasciwosci
{
class Program
{
static void Main(string[] args)
{
Car car = new Car();
// Ustawiamy wartości w polach prywatnych za pomocą właściowości
car.Brand = "Audi";
car.Model = "RS6";
car.Capacity = 4.0;
Console.WriteLine("Info: {0}", car.ToString());
Console.ReadKey();
// Wynik działania programu
// Info: Marka: Audi | Model: RS6 | Pojemnosc: 4 l
}
}
class Car
{
// Pola nie są dostępne z zewnątrz
private string brand = "N.A";
private string model = "N.A";
private double capacity = 0.0;
// Deklaracja właściwości Brand z dostępem do pola prywatnego brand
public string Brand
{
get
{
return brand;
}
set
{
brand = value;
}
}
// Można również dokonać zapisu w jednej linii
public string Model { get { return model; } set { model = value; } }
// Oraz kolejna forma zapisu
public double Capacity
{
get { return capacity; }
set { capacity = value; }
}
public override string ToString()
{
string returnedString = string.Format("Marka: {0} | Model: {1} | Pojemnosc: {2} l", brand, model, capacity);
return returnedString;
}
}
}
Właściwości abstrakcyjne
Klasy abstrakcyjne mogą posiadać abstrakcyjne właściwości, które muszą być zaimplementowane w klasach pochodnych. Poniższy
program pokazuje zastosowanie abstrakcyjnych właściwości:
using System;
namespace WlasciwosciAbstrakcja
{
class Program
{
static void Main(string[] args)
{
SuperCar sc = new SuperCar();
sc.Brand = "Pagani";
sc.Model = "Zonda F";
sc.Capacity = 7.3;
Console.WriteLine("Info: {0}", sc.ToString());
Console.ReadKey();
// Wynik działania programu
// Info: Marka: Pagani | Model: Zonda F | Pojemnosc: 7.3 l
}
}
abstract class Car
{
private string brand = "N.A";
private string model = "N.A";
private double capacity = 0.0;
// Deklaracja właściwości Brand z dostępem do pola prywatnego brand
public abstract string Brand
{
get;
set;
}
public abstract string Model
{
get;
set;
}
public abstract double Capacity
{
get;
set;
}
}
class SuperCar: Car
{
private string brand;
private string model;
private double capacity;
// Celowo przedstawiam różne zapisy, żebyś wybrał ten, który najbardziej Ci odpowiada
public override string Brand { get { return brand; } set { brand = value; } }
public override string Model
{
get
{
return model;
}
set
{
model = value;
}
}
public override double Capacity
{
get { return capacity; }
set { capacity = value; }
}
public override string ToString()
{
string returnedString = string.Format("Marka: {0} | Model: {1} | Pojemnosc: {2} l", brand, model, capacity);
return returnedString;
}
}
}