Projektowanie i używanie klas

Ukończone

W programowaniu obiektowym (OOP) klasy są blokami konstrukcyjnymi aplikacji. Zrozumienie relacji między klasami i obiektami jest niezbędne.

  • Klasy to strategie używane przez deweloperów do definiowania właściwości (danych) i metod (zachowań) obiektów. Klasy zapewniają sposób hermetyzacji danych i zachowania, co ułatwia organizowanie kodu i zarządzanie nim.
  • Obiekty są instancjami klas. Kiedy klasa jest tworzona, obiekt jest tworzony w pamięci. Każdy obiekt ma własny zestaw właściwości i metod, ale ma tę samą strukturę zdefiniowaną przez klasę.

Zapoznanie się z obiektami rzeczywistymi wokół programu może pomóc zrozumieć, jak działają klasy i obiekty w programowaniu. Obiekty w świecie rzeczywistym mają atrybuty (właściwości) i zachowania (metody), które definiują ich przeznaczenie i funkcjonalność. Na przykład samochód jest obiektem z atrybutami, takimi jak marka, model i kolor, oraz zachowaniami, takimi jak jazda i zatrzymywanie.

Obiekty świata rzeczywistego

Ludzie nieustannie wchodzą w interakcje z obiektami w swoim codziennym życiu. W rzeczywistości prawie wszystko, z którymi współpracujemy, można traktować jako obiekt.

Do definiowania obiektów w świecie rzeczywistym można użyć następujących kryteriów:

  • Obiekty to rzeczy, które widzimy i dotykamy.
  • Obiekty mają cel.
  • Obiekty mają części, które obsługują ich przeznaczenie.

Ołówek jest przykładem obiektu fizycznego. Celem ołówka jest utworzenie notatki lub rysunku. Części ołówka to korpus, końcówka i być może gumka. Części współpracują ze sobą, aby osiągnąć zamierzony cel ołówka.

Istnieją również obiekty fizyczne, które istnieją jako zestaw innych obiektów. Poniższa lista zawiera przykłady obiektów, które składają się z innych obiektów:

  • Samochód: Celem samochodu jest zapewnienie transportu naziemnego dla osób i rodzin. Części samochodu obejmują silnik, koła, kierownicę i wiele innych. Części samochodu współpracują ze sobą, aby umożliwić transport naziemny.
  • Dom: Celem domu jest zapewnienie schronienia. Części domu obejmują fundament, ściany zewnętrzne, dach i pokoje. Te części współpracują ze sobą, aby stworzyć przestrzeń mieszkalną.
  • Telefon inteligentny: Celem telefonu inteligentnego jest pomoc użytkownikowi w codziennych zadaniach i działaniach. Części telefonu inteligentnego obejmują ekran, mikroprocesor, pamięć i magazyn, baterię, aparaty fotograficzne i przyciski. Te części współpracują ze sobą, aby umożliwić komunikację, rozrywkę i produktywność.

Każda część samochodu, domu lub telefonu inteligentnego jest obiektem własnym celem, a także może być zestawem obiektów.

Atrybuty i cechy obiektu fizycznego

Poświęć minutę, aby rozważyć przykład ołówka. Ołówek ma części (treść, końcówka, gumka) i cel (utwórz notatkę lub rysunek). Ołówki mają te podstawowe cechy. Jednak nie wszystkie ołówki są takie same.

Niektóre ołówki są krótkie, niektóre są długie. Niektóre ołówki są żółte, niektóre są czarne. Niektóre ołówki mają nudną końcówkę, niektóre mają wyostrzone końcówki. Niektóre ołówki mają gumkę, niektóre nie mają gumki.

Atrybuty obiektu są często podzielone na następujące kategorie fizyczne i behawioralne:

  • Fizyczne: atrybuty fizyczne to aspekty obiektu, które można zobaczyć lub zmierzyć.
  • Zachowanie: Atrybuty behawioralne to aspekty obiektu, które opisują jego możliwości lub interakcje z innymi obiektami.

W przykładzie ołówka atrybuty fizyczne obejmują długość obudowy, kolor obudowy, ostrość końcówki i to, czy ołówek posiada gumkę. Atrybuty behawioralne obejmują możliwość zapisu, możliwość wymazywania i możliwość wyostrzenia. Ołówek wchodzi w interakcje z papierem lub innymi obiektami stałymi, na których można zapisywać lub rysować.

Atrybuty fizyczne są często określane jako właściwości, podczas gdy atrybuty behawioralne są często określane jako funkcje (metody w programowaniu w języku C#).

Klasy kodu i obiekty w programowaniu w języku C#

W świecie programowania w języku C# właściwości obiektów i metody są definiowane przez klasę. Klasy zapewniają szablon, który definiuje, co może robić obiekt (instancja klasy). Strategia klasy jest nazywana definicją klasy.

Gdy aplikacja jest uruchomiona, komputer używa definicji klasy do przydzielania pamięci dla obiektu (wystąpienia klasy). Komputer używa strategii do skonfigurowania bloku pamięci o odpowiednim rozmiarze dla obiektu. Obiekt jest w zasadzie blokiem pamięci.

Obiekty kodu, podobnie jak obiekty fizyczne, mogą mieć różne wartości przypisane do jego właściwości.

Klasy hermetyzują dane i zachowanie

Klasy zapewniają sposób hermetyzacji danych i zachowania. Hermetyzacja to proces łączenia danych i zachowania w jednej jednostce. Klasy używają właściwości, aby umożliwić dostęp do danych i metod w celu włączenia zachowań.

Właściwości klasy

Właściwości klasy służą do zarządzania danymi, które odróżniają jeden obiekt (wystąpienie klasy) od innego obiektu tego samego typu.

Właściwości klasy umożliwiają obiektom odczytywanie, zapisywanie lub obliczanie wartości zmiennych (pól danych) zdefiniowanych w klasie. Właściwości są wyświetlane jako członkowie danych publicznych, ale są implementowane jako metody specjalne nazywane metodami dostępu. Ta funkcja umożliwia obiektom wywołującym łatwe uzyskiwanie dostępu do danych i nadal pomaga promować bezpieczeństwo i elastyczność danych.

Wartości właściwości można odczytać przy użyciu metody dostępu get i przypisać przy użyciu metody dostępu set.

Metody klas

Metody klas definiują akcje (zachowania), które może wykonywać klasa.

Metody mogą przyjmować parametry dostarczające dane wejściowe i mogą zwracać dane wyjściowe za pomocą parametrów. Metody mogą również zwracać wartość bezpośrednio bez użycia parametru.

Na przykład klasa Console zawiera metody WriteLine, ReadLinei Clear (między innymi). Metody te ułatwiają włączenie zamierzonych zachowań klasy Console. Metody mogą służyć do wykonywania akcji, takich jak obliczenia, manipulowanie danymi lub interakcja z innymi obiektami.

Metody są często przeznaczone do akceptowania co najmniej jednego argumentu metody. Argumenty metody są przekazywane do metody jako parametry instrukcji wywołującej używanej do wywoływania metody. Na przykład metoda WriteLine klasy Console może akceptować argument ciągu dostarczony przez instrukcję wywołującą.

Definicje klas w kodzie języka C#

W poniższym przykładzie pokazano prostą klasę w języku C#. Klasa Phone ma właściwości Brand, Modeli Year. Klasa zawiera również metody Call i Text.


public class Phone
{
    public string? Brand { get; set; }
    public string? Model { get; set; }
    public int Year { get; set; }

    public void Call(string phoneNumber)
    {
        Console.WriteLine($"Calling {phoneNumber}...");
    }

    public void Text(string phoneNumber, string message)
    {
        Console.WriteLine($"Texting {phoneNumber}: {message}");
    }
}

Używanie przestrzeni nazw

W programowaniu w języku C# przestrzenie nazw są używane na dwa sposoby:

  • Biblioteka klas platformy .NET używa przestrzeni nazw do organizowania wielu klas.
  • Deweloperzy deklarują własne przestrzenie nazw, aby ułatwić kontrolowanie zakresu nazw klas i metod w większych projektach programistycznych.

Przestrzenie nazw w bibliotece klas platformy .NET

Przestrzenie nazw są używane przez bibliotekę klas .NET do grupowania spokrewnionych typów, co ułatwia ich odnajdywanie i wykorzystywanie.

Rozważmy następujący fragment kodu:


System.Console.WriteLine("Hello World!");

W tym przykładzie System jest przestrzenią nazw, a Console jest klasą w tej przestrzeni nazw.

Podanie w pełni kwalifikowanej nazwy klasy (System.Console) gwarantuje, że używana jest poprawna klasa. Jednak używanie w pełni kwalifikowanych nazw może być kłopotliwe podczas pracy z wieloma klasami z tej samej przestrzeni nazw. Aby zwiększyć czytelność kodu, możesz użyć dyrektywy using. Dyrektywa using umożliwia używanie typów zdefiniowanych w przestrzeni nazw bez określania w pełni kwalifikowanej przestrzeni nazw tego typu.

Poniższy fragment kodu implementuje dyrektywę using w celu zwiększenia czytelności kodu:


using System;

Console.WriteLine("Hello World!");

Notatka

Począwszy od platformy .NET 6, dyrektywy niejawneglobal using są dodawane do nowych projektów języka C#. Oznacza to, że można użyć typów zdefiniowanych w tych przestrzeniach nazw bez konieczności określania ich w pełni kwalifikowanej nazwy lub ręcznego dodawania dyrektywy using. Niejawny aspekt odnosi się do tego, że globalne dyrektywy using są dodawane do wygenerowanego pliku w katalogu obj projektu. Ta funkcja umożliwia używanie Console.WriteLine bez jawnego deklarowania using System podczas tworzenia aplikacji w wersji 6.0 lub nowszej platformy .NET.

Organizowanie klas za pomocą przestrzeni nazw

Deklarowanie własnych przestrzeni nazw może pomóc w kontrolowaniu zakresu nazw klas i metod w większych projektach programistycznych. Użyj słowa kluczowego namespace, aby zadeklarować przestrzeń nazw.

Rozważmy następujący fragment kodu:


namespace SampleNamespace
{
    class SampleClass
    {
        public void SampleMethod()
        {
            System.Console.WriteLine("SampleMethod inside SampleNamespace");
        }
    }
}

Nazwa przestrzeni nazw musi być prawidłową nazwą identyfikatora języka C#.

Przestrzeń nazw dla wszystkich typów zdefiniowanych w tym pliku można zadeklarować, jak pokazano w poniższym fragmencie kodu:


namespace SampleNamespace;

class SampleClass
{
    public void SampleMethod()
    {
        System.Console.WriteLine("SampleMethod inside SampleNamespace");
    }
}

class AnotherSampleClass
{
    public void AnotherSampleMethod()
    {
        System.Console.WriteLine("AnotherSampleMethod inside SampleNamespace");
    }
}

Zaletą tej nowej składni jest to, że jest prostsza, co pozwala zaoszczędzić miejsce w poziomie i nawiasy klamrowe. Ułatwia to odczytywanie kodu.

Omówienie przestrzeni nazw

Przestrzenie nazw mają następujące właściwości:

  • Organizują duże projekty kodu.
  • Są one rozdzielane za pomocą operatora ..
  • Dyrektywa using ukrywa wymóg określenia nazwy przestrzeni nazw dla każdej klasy.
  • Globalna przestrzeń nazw jest przestrzenią nazw "root": global::System zawsze odwołuje się do przestrzeni nazw systemu .NET.

Używanie przestrzeni nazw do grupowania powiązanych typów razem ułatwia ich znajdowanie i używanie.