TOC

This article has been localized into Hungarian by the community.

Osztályok:

Statikus tagok

Mint egy előző fejezetben láttuk, általában egy osztályhoz úgy férünk hozzá, hogy példányosítjuk azt, majd a keletkező példánnyal (objektummal) dolgozunk. A legtöbb esetben erről is szólnak az osztályok: több példányt lehet belőlük konstruálni, majd mindet más-más módon használni. Vannak esetek azonban, amikor szeretnéd, ha olyan osztályod lenne, amit példányosítás nélkül is használhatsz, vagy legalábbis olyan osztályod, aminek a tagjaihoz nem csak egy objektumon keresztül tudsz hozzáférni. Lehet, hogy van egy változó, aminek mindig ugyanaz az értéke van, használatának helyétől és módjától függetlenül. Az ilyeneket statikus tagnak hívják, mivel nem egy-egy objektumhoz, hanem magához az osztályhoz tartoznak.

Egy osztály lehet statikus, és egy osztálynak lehetnek statikus tagjai, akár metódusok azok, akár változók. Egy statikus osztályt nem lehet példányosítani, avagy inkább működik egymáshoz kötődő tagok összességeként, mintsem normális osztályként. Megteheted azt is, hogy nem-statikus osztályt írsz, de bizonyos tagjait statikusként jelölöd. Egy nem-statikus osztályt ugyanúgy lehet példányosítani, de az objektumon keresztül nem férhetsz hozzá a statikus tagokhoz. Ezzel szemben egy statikus osztálynak csak statikus tagjai lehetnek.

Íme egy példa statikus osztályra:

public static class Rectangle
{
    public static int CalculateArea(int width, int height)
    {
        return width * height;
    }
}

A static kulcsszó használatával statikusnak jelöljük az osztályt, majd a CalculateArea metóduson ezt megismételjük. Ha ezt nem tennénk, akkor a fordító panaszkodna, ugyanis statikus osztálynak nem lehet nem-statikus tagja.

A metódus használatához közvetlen az osztályra kell hivatkoznunk:

Console.WriteLine("The area is: " + Rectangle.CalculateArea(5, 4));

Akár más hasznos metódusokat is írhatnánk a Rectangle (négyzet) osztályunkba, de joggal kérdezheted, hogy miért a metódusnak adjuk meg a width és height paramétereket (szélesség, magasság), ahelyett, hogy az osztályban tárolnánk és onnan használnánk ezeket? Mert az osztály statikus! Tárolhatnánk ugyan a szükséges adatokat, de csak egyetlen négyzetét, mivel egy statikus osztálynak csak egyetlen verziója van. Ezt nagyon fontos megjegyezni.

Ha ilyen igényeink vannak, akkor helyette nem-statikussá tehetjük az osztályt, a CalculateArea metódust pedig segédmetódusként használjuk, és továbbra is statikusan hagyjuk:

public class Rectangle
{
    private int width, height;

    public Rectangle(int width, int height)
    {
        this.width = width;
        this.height = height;
    }

    public void OutputArea()
    {
        Console.WriteLine("Area output: " + Rectangle.CalculateArea(this.width, this.height));
    }

    public static int CalculateArea(int width, int height)
    {
        return width * height;
    }
}

Tehát ezúttal elhagytuk az osztályról a static kulcsszót, és hozzátettünk egy konstruktort. Ez egy szélesség és magasság paramétert vesz, amiket a megfelelő változókhoz rendel. Emellett kapott egy OutputArea metódust is, ami a statikus metódust használja a terület kiszámításához. Ez egy lehetséges módja a statikus és nem-statikus tagok együttes használatára nem-statikus osztályban.

A statikus osztályokat gyakran statikus osztályok írására használják, ám ez a gyakorlat sokak által megvetett. Ezekben az osztályokban különböző hasznos metódusok gyűlnek össze, amelyek ugyan nem tartoznak különösebben össze, de máshova sem nagyon tudnak beilleszkedni.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!