Ett klassfält eller -attribut ( medlemsvariabel, datamedlem, klassfält, instansvariabel ) i objektorienterad programmering är en variabel vars beskrivning skapas av programmeraren när klassen skapas . All objektdata lagras i dess fält. Fälten nås med deras namn. Vanligtvis anges datatypen för varje fält i klassbeskrivningen.
De strukturella typerna som stöds av de flesta programmeringsspråk ( kallade strukturer i C , poster i Pascal , och så vidare ) är ett specialfall av klasser - nämligen klasser av fält enbart. All information relaterad till klassfält gäller lika för strukturella typer.
Vanligtvis har varje objekt sina egna värden för alla dess fält. Klassfält inkluderar även statiska fält ( statiska datamedlemmar, statiska klassfält, klassvariabler ) — fält som är gemensamma för alla klassobjekt.
Statiska fält skiljer sig inte semantiskt från vanliga globala variabler , men de är bara tillgängliga med ett kvalificerat namn (dvs. anger klassnamnet), och därför, till skillnad från globala variabler, inte rör sig i den globala namnrymden.
I vissa objektorienterade programmeringsspråk , som Java , finns det inga globala variabler, och därför är statiska klassfält det enda sättet att lagra global data i program på dessa språk.
Vissa språk, som C++ , låter dig definiera bitfält . Dessa fält tar upp mindre än en minnesenhet ( byte , ord ); kompilatorn själv packar flera bitfält i en minnesenhet, samtidigt som du kan komma åt bitfälten som separata fält i klassen.
Konceptet med bitfält är inte begränsat till klassfält: analogt har det överförts till andra fall av packning av flera värden i en minnesenhet, till exempel i nätverksprotokoll och i filformat .
Vanligtvis görs åtkomstomfånget för klassfält privat , det vill säga åtkomst till dem är endast tillåtet för metoder i samma klass. Egenskaper används för att förse användare av en klass med värdena för dess fält : de tillåter klassen att kontrollera hur dess fält ändras, till exempel att kontrollera om ett givet värde ligger inom ett intervall av giltiga värden.
När fältåtkomst är inkapslad av egenskapsprocedurer är det möjligt att uppdatera koden som hanterar ändringar av den egenskapens värde utan att bryta kompatibiliteten med befintliga användare av klassen. Därför är det vanligt att skapa egendomsprocedurer för att komma åt klassfält, även när ingen ytterligare bearbetning av värden som tilldelats fältet krävs i det inledande utvecklingsskedet.
I Python hänvisas ofta till fält och metoder med den generiska termen attribut . Statiska attribut kan överbelastas på en instans. Instansattribut definieras inte i klassstrukturen, utan i metoder (till exempel en konstruktor). Attribut vars åtkomst styrs av separata metoder kallas egenskaper (åtkomst till attribut och egenskaper är syntaktiskt identiska):
klass Foo ( objekt ): z = 0 # klassattribut (statiskt attribut) def __init__ ( själv , x , y ): # självkonstruktör . _x = x # privat attribut (enligt avtal mellan programmerare) self . y = y # offentligt attribut def getx ( själv ): returnera själv . _x # metoder för att läsa, def setx ( själv , värde ): själv . _x = värde # poster def delx ( själv ): del själv . _x # remove property x = property ( getx , setx , delx , "Property 'x'." ) # egenskapsdefinitionAnsökan:
foo = Foo(2, 4) # skapa en instans foo.y = 10 # bind värde till attribut foo.x = 30 # samma men motsvarar foo.setx(30) print foo.x, foo.y, foo.z # utskriftsattribut del foo.x # tar bort en egenskap print foo._x # utfasad print foo.__x # fungerar inte eftersom det inte finns något sådant attribut i klassen