Utforma och använda klasser

Slutförd

I objektorienterad programmering (OOP) är klasser byggstenarna i ett program. Det är viktigt att du förstår relationen mellan klasser och objekt.

  • Klasser är de skisser som utvecklare använder för att definiera egenskaper (data) och metoder (beteenden) för objekt. Klasser ger ett sätt att kapsla in data och beteende, vilket gör det enklare att organisera och hantera kod.
  • Objekt är instanser av klasser. När en klass instansieras skapas ett objekt i minnet. Varje objekt har en egen uppsättning egenskaper och metoder, men delar samma struktur som definieras av klassen.

Genom att undersöka verkliga objekt runt omkring dig kan du förstå hur klasser och objekt fungerar i programmering. Objekt i verkligheten har attribut (egenskaper) och beteenden (metoder) som definierar deras syfte och funktioner. En bil är till exempel ett objekt med attribut som märke, modell och färg samt beteenden som körning och stopp.

Verkliga världens objekt

Människor interagerar ständigt med objekt i sitt dagliga liv. I själva verket kan nästan allt som vi interagerar med betraktas som ett objekt.

Följande kriterier kan användas för att definiera objekt i verkligheten:

  • Objekt är de saker som vi kan se och trycka på.
  • Objekt har ett syfte.
  • Objekt har delar som stöder deras syfte.

En penna är ett exempel på ett fysiskt objekt. Syftet med en penna är att skapa en anteckning eller en ritning. Delarna av en penna inkluderar kroppen, spetsen och kanske ett suddgummi. Delarna fungerar tillsammans för att uppnå det avsedda syftet med pennan.

Det finns också fysiska objekt som finns som en sammansättning av andra objekt. Följande lista innehåller exempel på objekt som består av andra objekt:

  • En bil: Syftet med en bil är att tillhandahålla marktransport för individer och familjer. Delarna av en bil inkluderar en motor, hjulen, en ratt och många andra. Delarna av en bil fungerar tillsammans för att möjliggöra marktransport.
  • Ett hus: Syftet med ett hus är att ge skydd. I delarna av ett hus finns en grund, ytterväggar, ett tak och rum. Dessa delar fungerar tillsammans för att skapa ett vardagsrum.
  • En smart telefon: Syftet med en smart telefon är att hjälpa användaren med dagliga uppgifter och aktiviteter. Delarna i en smart telefon innehåller en skärm, en mikroprocessor, minne och lagring, ett batteri, kameror och knappar. Dessa delar fungerar tillsammans för att möjliggöra kommunikation, underhållning och produktivitetsfunktioner.

Varje del av en bil, ett hus eller en smart telefon är ett objekt med sitt eget syfte och kan också vara en sammansättning av objekt.

Attribut och funktioner i ett fysiskt objekt

Ta en minut att tänka på exemplet med en penna. En penna har delar (kropp, spets, suddgummi) och ett syfte (skapa en anteckning eller ritning). Pennor delar dessa grundläggande egenskaper. Men inte alla pennor är desamma.

Vissa pennor är korta, andra är långa. Vissa pennor är gula, andra är svarta. Vissa pennor har en tråkig spets, vissa har en slipad spets. Vissa pennor har ett suddgummi, andra har inget suddgummi.

Attributen för ett objekt är ofta indelade i följande fysiska kategorier och beteendekategorier:

  • Fysisk: Fysiska attribut är aspekter av ett objekt som kan ses eller mätas.
  • Beteende: Beteendeattribut är de aspekter av ett objekt som beskriver dess funktioner eller interaktioner med andra objekt.

För pennexemplet inkluderar fysiska attribut längden på kroppen, kroppens färg, spetsens skärpa och huruvida pennan har ett suddgummi eller inte. Beteendeattributen omfattar möjligheten att skriva, möjligheten att radera och möjligheten att vässas. En penna interagerar med papper eller andra fasta objekt som kan skrivas eller ritas på.

Fysiska attribut kallas ofta egenskaper, medan beteendeattribut ofta kallas funktioner (metoder i C#-programmering).

Kodklasser och objekt i C#-programmering

I C#-programmeringens värld definieras objektegenskaper och -metoder av en klass. Klasser tillhandahåller skissen för vad ett objekt (en instans av klassen) kan göra. Skissen för en klass kallas för en klassdefinition.

När en app körs använder datorn en klassdefinition för att allokera minne för ett objekt (en instans av klassen). Datorn använder skissen för att konfigurera ett minnesblock som är rätt storlek för objektet. Ett objekt är i princip ett minnesblock.

Kodobjekt, precis som fysiska objekt, kan ha olika värden tilldelade till sina egenskaper.

Klasser kapslar in data och beteende

Klasser är ett sätt att kapsla in data och beteende. Inkapsling är processen att kombinera data och beteende till en enda enhet. Klasser använder egenskaper för att ge åtkomst till data och metoder för att aktivera beteenden.

Klassegenskaper

Klassegenskaper används för att hantera data som skiljer ett objekt (klassinstans) från ett annat objekt av samma typ.

Med klassegenskaper kan objekt läsa, skriva eller beräkna värdet för variabler (datafält) som definierats i klassen. Egenskaper visas som medlemmar i offentliga data, men de implementeras som särskilda metoder som kallas accessorer. Den här funktionen gör det möjligt för anropare att enkelt komma åt data och bidrar fortfarande till att främja datasäkerhet och flexibilitet.

Egenskapsvärden kan läsas med hjälp av en get-accessor och tilldelas med hjälp av en set-accessor.

Klassmetoder

Klassmetoder definierar de åtgärder (beteenden) som en klass kan utföra.

Metoder kan ta parametrar som ger indata och kan returnera utdata via parametrar. Metoder kan också returnera ett värde direkt, utan att använda en parameter.

Klassen Console innehåller till exempel WriteLine, ReadLineoch Clear metoder (bland annat). Dessa metoder hjälper till att aktivera de avsedda beteendena för klassen Console. Metoder kan användas för att utföra åtgärder, till exempel beräkningar, datamanipulering eller interaktion med andra objekt.

Metoder är ofta utformade för att acceptera ett eller flera metodargument. Metodargument skickas till metoden som parametrar för den anropande instruktion som används för att anropa metoden. Till exempel kan WriteLine-metoden för klassen Console acceptera ett strängargument som tillhandahålls av anropande instruktionen.

Klassdefinitioner i C#-kod

I följande exempel visas en enkel klass i C#. Klassen Phone har egenskaper för Brand, Modeloch Year. Klassen innehåller även metoder för Call och 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}");
    }
}

Använda namnområden

I C#-programmering används namnområden på två sätt:

  • .NET-klassbiblioteket använder namnområden för att organisera sina många klasser.
  • Utvecklare deklarerar sina egna namnområden för att styra omfånget för klass- och metodnamn i större programmeringsprojekt.

Namnrymder i .NET-klassbiblioteket

Namnområden används av .NET-klassbiblioteket för att gruppera relaterade typer, vilket gör det enklare att hitta och använda dem.

Överväg följande kodfragment:


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

I det här exemplet är System ett namnområde och Console är en klass i namnområdet.

Om du anger det fullständigt kvalificerade namnet på klassen (System.Console) ser du till att rätt klass används. Det kan dock vara besvärligt att använda fullständigt kvalificerade namn när du arbetar med många klasser från samma namnområde. För att förbättra kodens läsbarhet kan du använda using-direktivet. Med using-direktivet kan du använda typer som definierats i ett namnområde utan att ange det fullständigt kvalificerade namnområdet för den typen.

Följande kodfragment implementerar using-direktivet för att förbättra kodens läsbarhet:


using System;

Console.WriteLine("Hello World!");

Anteckning

Från och med .NET 6 läggs implicitaglobal using direktiv till i nya C#-projekt. Det innebär att du kan använda typer som definierats i dessa namnområden utan att behöva ange deras fullständigt kvalificerade namn eller lägga till ett användningsdirektiv manuellt. Den implicita aspekten avser det faktum att de globala användningsdirektiven läggs till i en genererad fil i projektets obj-katalog. Med den här funktionen kan du använda Console.WriteLine utan att uttryckligen deklarera using System när du utvecklar appar i version 6.0 eller senare av .NET.

Ordna klasser med namnområden

Om du deklarerar egna namnområden kan du styra omfånget för klass- och metodnamn i större programmeringsprojekt. Använd nyckelordet namespace för att deklarera ett namnområde.

Överväg följande kodfragment:


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

Namnet på namnområdet måste vara ett giltigt C#-identifierarnamn.

Du kan deklarera ett namnområde för alla typer som definierats i filen, enligt följande kodfragment:


namespace SampleNamespace;

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

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

Fördelen med den här nya syntaxen är att det är enklare att spara vågrätt utrymme och klammerparenteser. Det gör koden enklare att läsa.

Översikt över namnområden

Namnområden har följande egenskaper:

  • De organiserar stora kodprojekt.
  • De avgränsas med operatorn ..
  • using-direktivet undanröjer kravet på att ange namnet på namnområdet för varje klass.
  • Det globala namnområdet är namnområdet "root": global::System refererar alltid till .NET System-namnområdet.

Om du använder namnrymder för att gruppera relaterade typer tillsammans blir det enklare att hitta och använda dem.