W dzisiejszym poście Chciałbym poruszyć temat właściwości w języku C#.
Czym są właściwości i jak poprawnie je określać?
Let’s start.
Jak dobrze pamiętacie z wpisu o zmiennych – 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 tzw. akcesorów, dzięki czemu pola prywatne są dostępne z zewnątrz klasy.
To co bardzo istotne i warte zapamiętania to fakt, że Właściwości nie służą do przechowywania wartości. Przy pomocy akcesorów mają dostęp do pól, które reprezentują.
Możemy założyć, że mamy zdefiniowaną klasę o nazwie ( hmm i nastała cisza, cisza przed burzą w moim mózgu, aby na szybko wymyślić nazwę klasy, która będzie miała sens (??)… dobra mam! będzie to samochód – myślę że wybór jest ok 😉 ) Car, która ma prywatne pola: marka, model, silnik. Pola te nie mają bezpośredniego dostępu z zewnątrz danej klasy ale używając właśnie właściwości, będziemy mogli w prosty sposób uzyskać do nich dostęp.
Ale zanim o samochodzie, pokrótce wyjaśnijmy pojęcie Akcesorów.
Akcesory
Akcesor właściwości zawiera instrukcje do wykonania, które pozwalają na odczyt lub zapis wartości pola. Deklaracje właściwości mogą zawierać akcesor get, set lub oba”.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
namespace Props { class Program { static void Main(string[] args) { Car car = new Car(); // 'Car.brand' not available due to access level car.brand = "BMW"; // let's try get access car.Brand = "BMW"; } } class Car { // Fields are not available from outside private string brand; private string model; private double engine; // Props declaration with access to private field public string Brand { get { return brand; } set { brand = value; } } } } |
poniżej przedstawiam przykład poprawnego zastosowania właściwości:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
using System; namespace Props { class Program { static void Main(string[] args) { Car car = new Car(); car.Brand = "BMW"; car.Model = "M5"; car.Engine = 5.0; Console.WriteLine("Info: {0}", car.ToString()); Console.ReadKey(); } } class Car { private string brand = "N.A"; private string model = "N.A"; private double engine = 0.0; public string Brand { get { return brand; } set { brand = value; } } public string Model { get { return model; } set { model = value; } } public double Engine { get { return engine; } set { engine = value; } } public override string ToString() { string returnedString = string.Format("Brand: {0} | Model: {1} | engine: {2} l", brand, model, engine); return returnedString; } } } |
I tak oto w prosty sposób możemy uzyskać dostęp do właściwości danego pola.
Właściwości abstrakcyjne
Mówiąc o właściwościach nie wypada nie wspomnieć o właściwościach abstrakcyjnych
Klasy abstrakcyjne mogą posiadać abstrakcyjne właściwości, które muszą być zaimplementowane w klasach pochodnych. Poniższy blok kodu przedstawia zastosowanie abstrakcyjnych właściwości:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
using System; namespace AbstractProps { class Program { static void Main(string[] args) { SuperCar sc = new SuperCar(); sc.Brand = "Koenigsegg"; sc.Model = "Agera"; sc.Engine = 5.0; Console.WriteLine("Info: {0}", sc.ToString()); Console.ReadKey(); } } abstract class Car { private string brand = "N.A"; private string model = "N.A"; private double capacity = 0.0; public abstract string Brand { get; set; } public abstract string Model { get; set; } public abstract double Engine { get; set; } } class SuperCar : Car { private string brand; private string model; private double engine; public override string Brand { get { return brand; } set { brand = value; } } public override string Model { get { return model; } set { model = value; } } public override double Engine { get { return engine; } set { engine = value; } } public override string ToString() { string returnedString = string.Format("Brand: {0} | Model: {1} | Engine: {2} l", brand, model, engine); return returnedString; } } } |
hmmm…
W temacie właściwości to chyba tyle. Najważniejsze, jak dla mnie, to sposób w jaki uzyskujemy dostęp do właściwości.
Jak zawsze kod wrzucony będzie do GitHuba.
Podobało się? dajcie like’a 😉 lub piszcie i komentujcie.