Design og brug klasser
I objektorienteret programmering er klasser komponenterne i et program. Det er vigtigt at forstå relationen mellem klasser og objekter.
- Klasser er de kursusplaner, som udviklere bruger til at definere egenskaber (data) og metoder (funktionsmåder) for objekter. Klasser gør det muligt at indkapsle data og funktionsmåde, hvilket gør det nemmere at organisere og administrere kode.
- Objekter er forekomster af klasser. Når en klasse instantieres, oprettes der et objekt i hukommelsen. Hvert objekt har sit eget sæt egenskaber og metoder, men deler den samme struktur, der er defineret af klassen.
Hvis du undersøger objekterne i den virkelige verden omkring dig, kan det hjælpe dig med at forstå, hvordan klasser og objekter fungerer i programmering. Objekter i den virkelige verden har attributter (egenskaber) og funktionsmåder (metoder), der definerer deres formål og funktionalitet. En bil er f.eks. et objekt med attributter som f.eks. mærke, model og farve og funktionsmåder som f.eks. kørsel og stop.
Objekter i den virkelige verden
Folk interagerer konstant med objekter i deres daglige liv. Faktisk kan næsten alt, hvad vi interagerer med, opfattes som et objekt.
Følgende kriterier kan bruges til at definere objekter i den virkelige verden:
- Objekter er de ting, vi kan se og røre ved.
- Objekter har et formål.
- Objekter har dele, der understøtter deres formål.
En blyant er et eksempel på et fysisk objekt. Formålet med en blyant er at oprette en note eller en tegning. De dele af en blyant omfatter kroppen, spidsen, og måske en viskelæder. Delene arbejder sammen for at opnå det tilsigtede formål med blyanten.
Der findes også fysiske objekter som en samling af andre objekter. Følgende liste indeholder eksempler på objekter, der består af andre objekter:
- En bil: Formålet med en bil er at levere landtransport til enkeltpersoner og familier. Delene af en bil omfatter en motor, hjulene, et rat og mange andre. Delene i en bil arbejder sammen for at muliggøre landtransport.
- Et hus: Formålet med et hus er at give husly. Husets dele omfatter et fundament, udvendige vægge, et tag og værelser. Disse dele arbejder sammen om at skabe et levende rum.
- En smartphone: Formålet med en smartphone er at hjælpe brugeren med daglige opgaver og aktiviteter. Delene på en smartphone omfatter en skærm, en mikroprocessor, hukommelse og lagerplads, et batteri, kameraer og knapper. Disse dele arbejder sammen for at muliggøre kommunikation, underholdning og produktivitetsfunktioner.
Hver del af en bil, et hus eller en smartphone er et objekt med sit eget formål og kan også være en samling af objekter.
Attributter og funktioner for et fysisk objekt
Brug et øjeblik på at overveje eksemplet med en blyant. En blyant indeholder dele (brødtekst, tip, viskelæder) og et formål (opret en note eller tegning). Blyanter deler disse grundlæggende egenskaber. Det er dog ikke alle blyanter, der er ens.
Nogle blyanter er korte, nogle er lange. Nogle blyanter er gule, nogle er sorte. Nogle blyanter har en kedelig tip, nogle har en skærpet tip. Nogle blyanter har et viskelæder, nogle har ikke et viskelæder.
Attributterne for et objekt er ofte opdelt i følgende fysiske og adfærdsmæssige kategorier:
- Fysisk: Fysiske attributter er de aspekter af et objekt, der kan ses eller måles.
- Funktionsmåde: Funktionsmådeattributter er de aspekter af et objekt, der beskriver dets egenskaber eller interaktioner med andre objekter.
I eksemplet med blyanten omfatter fysiske attributter længden af kroppen, kroppens farve, spidsens skarphed, og om blyanten har et viskelæder eller ej. Funktionsmådeattributterne omfatter muligheden for at skrive, muligheden for at slette og muligheden for at blive skærpet. En blyant interagerer med papir eller andre faste objekter, der kan skrives eller tegnes på.
Fysiske attributter kaldes ofte egenskaber, mens adfærdsattributter ofte kaldes funktioner (metoder i C#-programmering).
Kodeklasser og objekter i C#-programmering
I C#-programmeringens verden defineres objektegenskaber og -metoder af en klasse. Klasser indeholder kursusplanen for, hvad et objekt (en forekomst af klassen) kan gøre. Kursusplanen for en klasse kaldes en klassedefinition.
Når en app kører, bruger computeren en klassedefinition til at tildele hukommelse til et objekt (en forekomst af klassen). Computeren bruger kursusplanen til at konfigurere en hukommelsesblok, der har den rigtige størrelse til objektet. Et objekt er dybest set en hukommelsesblok.
Kodeobjekter kan på samme måde som fysiske objekter have forskellige værdier tildelt til egenskaberne.
Klasser indkapsler data og funktionsmåde
Klasser gør det muligt at indkapsle data og funktionsmåde. Indkapsling er processen med at kombinere data og funktionsmåde i en enkelt enhed. Klasser bruger egenskaber til at give adgang til data og metoder for at aktivere funktionsmåder.
Klasseegenskaber
Klasseegenskaber bruges til at administrere de data, der adskiller ét objekt (klasseforekomst) fra et andet objekt af samme type.
Klasseegenskaber gør det muligt for objekter at læse, skrive eller beregne værdien af variabler (datafelter), der er defineret i klassen. Egenskaber vises som offentlige datamedlemmer, men de implementeres som særlige metoder, der kaldes accessors. Denne funktion gør det nemt for opkaldere at få adgang til data og hjælper stadig med at fremme datasikkerhed og fleksibilitet.
Egenskabsværdier kan læses ved hjælp af en get accessor og tildeles ved hjælp af en set accessor.
Klassemetoder
Klassemetoder definerer de handlinger (funktionsmåder), som en klasse kan udføre.
Metoder kan tage parametre, der leverer inputdata, og kan returnere outputdata via parametre. Metoder kan også returnere en værdi direkte uden brug af en parameter.
Klassen Console omfatter f.eks. metoderne WriteLine, ReadLineog Clear (bl.a.). Disse metoder hjælper med at aktivere den tilsigtede funktionsmåde for klassen Console. Metoder kan bruges til at udføre handlinger, f.eks. beregninger, datamanipulation eller interaktion med andre objekter.
Metoder er ofte designet til at acceptere et eller flere metodeargumenter. Metodeargumenter overføres til metoden som parametre for den kaldende sætning, der bruges til at aktivere metoden. Metoden WriteLine for klassen Console kan f.eks. acceptere et strengargument, der leveres af kaldsætningen.
Klassedefinitioner i C#-kode
I følgende eksempel vises en simpel klasse i C#. Klassen Phone har egenskaber for Brand, Modelog Year. Klassen indeholder også metoder til Call og 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}");
}
}
Brug af navneområder
I C#-programmering bruges navneområder på to måder:
- .NET-klassebiblioteket bruger navneområder til at organisere sine mange klasser.
- Udviklere erklærer deres egne navneområder for at hjælpe med at styre omfanget af klasse- og metodenavne i større programmeringsprojekter.
Navneområder i .NET-klassebiblioteket
Navneområder bruges af .NET-klassebiblioteket til at gruppere relaterede typer sammen, hvilket gør det nemmere at finde og bruge dem.
Overvej følgende kodestykke:
System.Console.WriteLine("Hello World!");
I dette eksempel er System et navneområde, og Console er en klasse i det pågældende navneområde.
Hvis du angiver det fuldt kvalificerede navn på klassen (System.Console), sikrer du, at den korrekte klasse bruges. Det kan dog være besværligt at bruge fuldt kvalificerede navne, når du arbejder med mange klasser fra det samme navneområde. Hvis du vil forbedre læsbarheden af kode, kan du bruge using-direktivet. Med using-direktivet kan du bruge de typer, der er defineret i et navneområde, uden at angive det fuldt kvalificerede navneområde for den pågældende type.
Følgende kodestykke implementerer using-direktivet for at forbedre kodelæsbarheden:
using System;
Console.WriteLine("Hello World!");
Seddel
Fra og med .NET 6 føjes implicitteglobal using-direktiver til nye C#-projekter. Det betyder, at du kan bruge typer, der er defineret i disse navneområder, uden at skulle angive deres fuldt kvalificerede navn eller manuelt tilføje et brugerdirektiv. Det implicitte aspekt refererer til det faktum, at de globale brugerdirektiver føjes til en genereret fil i projektets obj directory. Denne funktion giver dig mulighed for at bruge Console.WriteLine uden eksplicit at erklære using System, når du udvikler apps i version 6.0 eller nyere af .NET.
Organisering af klasser med navneområder
Erklæring af dine egne navneområder kan hjælpe dig med at styre omfanget af klasse- og metodenavne i større programmeringsprojekter. Brug nøgleordet namespace til at deklarere et navneområde.
Overvej følgende kodestykke:
namespace SampleNamespace
{
class SampleClass
{
public void SampleMethod()
{
System.Console.WriteLine("SampleMethod inside SampleNamespace");
}
}
}
Navnet på navneområdet skal være et gyldigt C#-id-navn.
Du kan deklarere et navneområde for alle de typer, der er defineret i filen, som vist i følgende kodestykke:
namespace SampleNamespace;
class SampleClass
{
public void SampleMethod()
{
System.Console.WriteLine("SampleMethod inside SampleNamespace");
}
}
class AnotherSampleClass
{
public void AnotherSampleMethod()
{
System.Console.WriteLine("AnotherSampleMethod inside SampleNamespace");
}
}
Fordelen ved denne nye syntaks er, at det er enklere, hvilket sparer vandret plads og klammeparenteser. Det gør det nemmere at læse din kode.
Oversigt over navneområder
Navneområder har følgende egenskaber:
- De organiserer store kodeprojekter.
- De afgrænses ved hjælp af operatoren
.. -
using-direktivet overflødiggør kravet om at angive navnet på navneområdet for hver klasse. - Det globale navneområde er navneområdet "root":
global::Systemhenviser altid til .NET System-navneområdet.
Brug af navneområder til at gruppere relaterede typer sammen gør det nemmere at finde og bruge dem.