Klasy

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 2206 razy

Wstęp

Klasy w C# są typami referencyjnymi, co oznacza, że każda instancja klasy jest wskaźnikiem na jakiś adres pamięci, gdzie wszystkie pola oraz metody klasy się znajdują. Dzięki takiemu rozwiązaniu dużo szybciej można operować na obiektach danej klasy. W C# każda klasa dziedziczy po klasie Object i może dziedziczyć tylko po jednej klasie. Nie ma natomiast ograniczeń, jeżeli chodzi o dziedziczenie po interfejsach.

Podstawowa deklaracja klasy

Poniżej zamieszczam ogólny wzór podstawowej deklaracji klasy:

rodzaj_dostępu class nazwa_klasy : nazwa_klasy_bazowej, interfejs1, interfejs2, ... { rodzaj_dostępu typ_danych pole1; rodzaj_dostępu typ_danych pole2; rodzaj_dostępu nazwa_klasy(typ_danych pole1, typ_danych pole2) // konstruktor : base() // wywołanie konstruktora klasy bazowej { this.pole1 = pole1; this.pole2 = pole2; } rodzaj_dostępu nazwa_klasy(nazwa_klasy obiekt_klasy) // konstruktor kopiujący : base(obiekt_klasy) // wywołanie konstruktora kopiującego klasy bazowej { this.pole1 = obiekt_klasy.pole1; this.pole2 = obiekt_klasy.pole2; } rodzaj_dostępu ~nazwa_klasy() //destruktor { } }

Oczywiście rodzaj dostępu może być jednym z pięciu dostępnych:

Dodawanie pliku klasy do projektu

W głównym kodzie programu (czyli w pliku Program.cs) można co prawda umieszczać deklaracje klas, jednakże nie jest to zalecane zwłaszcza w przypadku dużych projektów. Z tego też powodu warto nauczyć się tworzyć dodatkowe pliki z kodem klas. W tym celu należy wcisnąć kombinację klawiszy Ctr+Alt+L lub w menu kliknąć View→Source Explorer, powinno pojawić się okno Source Explorer, w którym niezwłocznie należy kliknąć prawym przyciskiem myszy by w menu podręcznym kliknąć pozycję Add→Class....

Rys. 1
Menu kontekstowe programu VS EE dostępne z poziomu okna Source Explorer

Po kliknięciu wcześniej wymienionej pozycji menu pojawić się powinno okno dialogowe Add New Item - Klasy, w którym niezwłocznie wpisać należy nazwę klasy dodawanej, czyli Point2D po czym należy wcisnąć przycisk Add by plik został dodany.

Rys. 2
Okno dialogowe Add New Item - Klasy, umożliwiające dodawanie nowego pliku z klasą.

Przykład implementacji klas

W nowo utworzonym pliku zamieszczony zostanie następujący kod dwóch klas: Point2D i Point3D:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Klasy { // ########################### DEKLARACJA KLASY POINT@D ############################# public class Point2D { // ####################### CHRONIONE POLA KLASY ################################# protected double x; protected double y; // ####################### KONSTRUKTORY KLASY ################################### public Point2D() // konstruktor zerujący { x = y = 0; } public Point2D(double x, double y) // konstruktor ustawiajacy { this.x = x; this.y = y; } public Point2D(Point2D p) // kosntruktor kopiujący { this.x = p.x; this.y = p.y; } // ######## WŁAŚCIWOŚCI KLASY ########## public double Y { get { return y; } set { y = value; } } public double X { get { return x; } set { x = value; } } public double Length { get { return Math.Sqrt(x * x + y * y); } // pobieranie długości wektora set // ustawianie długości wektora { if (x != 0 || y != 0) // gdy wektor nie jest zerowy to { double k = value / Length; x *= k; // skalowanie składowej x wektora y *= k; // skalowanie składowej y wektora } } } // ########### METODY ############# public override string ToString() // przeładowana metoda ToString klasy bazowej Object { return "Point2D x = " + x + "; y = " + y; } } // ############################## DEKLARACJA KLASY POINT3D ################################# public class Point3D : Point2D // dziedziczy po Point2D { // ########################## CHRONIONE POLA KLASY ##################################### protected double z; // ########################## KONSTRUKTORY KLASY ####################################### public Point3D() : base() // wywołanie bezparametrowego kosntruktora klasy bazowej { z = 0; } public Point3D(double x, double y, double z) : base(x, y) // wywołanie ustawiającego konstruktora klasy bazowej { this.z = z; } public Point3D(Point3D p) // konstruktor kopiujący : base(p) // wywołanie kontruktora kopiującego klasy bazowej { z = p.z; } // ################# WŁAŚCIWOŚCI ############### public double Z { get { return z; } set { z = value; } } public new double Length // przysłanianie właściwości z klasy bazowej (oznacza to słowo kluczowe new) { get { return Math.Sqrt(x * x + y * y + z * z); } // pobieranie długości wektora set // ustawianie długości wektora { if (x != 0 || y != 0 || z != 0) { double k = value / Length; X *= k; Y *= k; z *= k; } } } // ################# METODY ################ public new string ToString() // przysłanianie metody z klasy bazowej (oznacza to słowo kluczowe new) { return "Point3D x = " + X + "; y = " + Y + "; z = " + z; } } }

O właściwościach rozpisywałem się przy okazji omawiania tematu związanego z Programowanie → Podstawy C# → Struktury, również temat dotyczący metod został już niejako poruszony, natomiast to na co należy zwrócić uwagę, to sposób dziedziczenia i obsługi konstruktorów klasy.

W pliku Program.cs należy umieścić następujący kod:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Klasy { class Program { static void Main(string[] args) { var p3d = new Point3D(10, 20, 30); Console.WriteLine(p3d.ToString()); Point2D p2d = p3d; Console.WriteLine(p2d.ToString()); Console.ReadLine(); } } }

Skompilowanie kodu da następujący efekt:

Point3D x = 10; y = 20; z = 30
Point2D x = 10; y = 20

Stało się tak, ponieważ klasa Point3D dziedziczy po klasie Point2D.

Propozycje książek
tytuł: C# 10. Programowanie. Tworzenie aplikacji Windows, internetowych i biurowych autor: Ian Griffiths

Tytuł:

C# 10. Programowanie. Tworzenie aplikacji Windows, internetowych i biurowych

Autor:

Ian Griffiths

tytuł: C# 10 i .NET 6 dla programistów aplikacji wieloplatformowych. Twórz aplikacje, witryny WWW oraz serwisy sieciowe za pomocą ASP.NET Core 6, Blazor i EF Core 6 w Visual Studio 2022 i Visual Studio Code. Wydanie VI autor: Mark J. Price

Tytuł:

C# 10 i .NET 6 dla programistów aplikacji wieloplatformowych. Twórz aplikacje, witryny WWW oraz serwisy sieciowe za pomocą ASP.NET Core 6, Blazor i EF Core 6 w Visual Studio 2022 i Visual Studio Code. Wydanie VI

Autor:

Mark J. Price

tytuł: Visual Studio 2022, C# i .NET. Programowanie kontrolek autor: Łukasz Sosna

Tytuł:

Visual Studio 2022, C# i .NET. Programowanie kontrolek

Autor:

Łukasz Sosna

tytuł: C# 10. Leksykon kieszonkowy autor: Joseph Albahari, Ben Albahari

Tytuł:

C# 10. Leksykon kieszonkowy

Autor:

Joseph Albahari, Ben Albahari

tytuł: Wzorce projektowe w .NET Core 3. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F# autor: Dmitri Nesteruk

Tytuł:

Wzorce projektowe w .NET Core 3. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F#

Autor:

Dmitri Nesteruk

tytuł: Jak pisać świetne gry 2D w Unity. Niezależne programowanie w języku C# autor: Jared Halpern

Tytuł:

Jak pisać świetne gry 2D w Unity. Niezależne programowanie w języku C#

Autor:

Jared Halpern

tytuł: C# 9.0 w pigułce autor: Joseph Albahari

Tytuł:

C# 9.0 w pigułce

Autor:

Joseph Albahari

tytuł: C# 9.0. Leksykon kieszonkowy autor: Joseph Albahari, Ben Albahari

Tytuł:

C# 9.0. Leksykon kieszonkowy

Autor:

Joseph Albahari, Ben Albahari

tytuł: C# 8.0. Kompletny przewodnik dla praktyków. Wydanie VII autor: Mark Michaelis

Tytuł:

C# 8.0. Kompletny przewodnik dla praktyków. Wydanie VII

Autor:

Mark Michaelis

tytuł: C# 8.0 w pigułce autor: Joseph Albahari, Eric Johannsen

Tytuł:

C# 8.0 w pigułce

Autor:

Joseph Albahari, Eric Johannsen

W związku z tym, że firma Helion nie wywiązuje się z swoich zobowiązań naliczania prowizji za każdą zakupioną książkę a kontakt z ową frmą jest nie możliwy autor strony zmuszony został do zablokowania linkowania książek. Za wszelkie niedogodności z tym związane z góry przepraszam i obiecuję włączenie linkowania gdy tylko sprawa zostanie wyjaśniona