absztrakt (C# referencia)
A abstract
módosító azt jelzi, hogy a módosítandó dolog végrehajtása hiányzik vagy hiányos. Az absztrakt módosító osztályokkal, metódusokkal, tulajdonságokkal, indexelőkkel és eseményekkel használható. abstract
Az osztálydeklaráció módosítójával jelezheti, hogy egy osztály csak más osztályok alaposztálya, és nem példányosítva. Az absztraktként megjelölt tagokat nem absztrakt osztályoknak kell megvalósítaniuk, amelyek az absztrakt osztályból származnak.
1. példa
Ebben a példában az osztálynak Square
meg kell adnia egy implementációt GetArea
, mert a következőből Shape
származik:
abstract class Shape
{
public abstract int GetArea();
}
class Square : Shape
{
private int _side;
public Square(int n) => _side = n;
// GetArea method is required to avoid a compile-time error.
public override int GetArea() => _side * _side;
static void Main()
{
var sq = new Square(12);
Console.WriteLine($"Area of the square = {sq.GetArea()}");
}
}
// Output: Area of the square = 144
Az absztrakt osztályok a következő funkciókkal rendelkeznek:
Absztrakt osztály nem hozható létre.
Az absztrakt osztályok absztrakt metódusokat és tartozékokat tartalmazhatnak.
A lezárt módosítóval nem lehet módosítani egy absztrakt osztályt, mert a két módosító ellentétes jelentéssel rendelkezik. A
sealed
módosító megakadályozza egy osztály öröklését, és aabstract
módosító megköveteli az osztály öröklését.Az absztrakt osztályból származtatott nem absztrakt osztálynak tartalmaznia kell az összes örökölt absztrakt metódus és tartozék tényleges implementációit.
abstract
A módosító egy metódusban vagy tulajdonságdeklarációban azt jelzi, hogy a metódus vagy tulajdonság nem tartalmaz implementációt.
Az absztrakt metódusok a következő funkciókkal rendelkeznek:
Az absztrakt metódus implicit módon virtuális módszer.
Az absztrakt metódus deklarációi csak absztrakt osztályokban engedélyezettek.
Mivel az absztrakt metódus deklarációja nem biztosít tényleges megvalósítást, nincs metódustörzs; a metódusdeklaráció egyszerűen pontosvesszővel végződik, és az aláírás után nincs kapcsos zárójel ({ }). Példa:
public abstract void MyMethod();
A megvalósítást egy metódus felülbírálása biztosítja, amely egy nem absztrakt osztály tagja.
Hiba a statikus vagy virtuális módosítók használata absztrakt metódus deklarációjában.
Az absztrakt tulajdonságok absztrakt metódusokhoz hasonlóan viselkednek, kivéve a deklaráció és a meghívás szintaxisának különbségeit.
Hiba a módosító statikus tulajdonságon való használata
abstract
.Az absztrakt öröklődő tulajdonság felülbírálható egy származtatott osztályban a felülbírálási módosítót használó tulajdonságdeklarációval.
Az absztrakt osztályokról további információt az Absztrakt és a Lezárt osztályok és osztálytagok című témakörben talál.
Az absztrakciós osztálynak minden felülettag számára implementációt kell biztosítania.
Az interfészt megvalósító absztrakt osztály absztrakciós módszerekre képezheti le a felületi metódusokat. Példa:
interface I
{
void M();
}
abstract class C : I
{
public abstract void M();
}
2. példa
Ebben a példában az osztály DerivedClass
egy absztrakt osztályból BaseClass
származik. Az absztrakt osztály tartalmaz egy absztrakt metódust, AbstractMethod
valamint két absztrakt tulajdonságot és Y
X
.
// Abstract class
abstract class BaseClass
{
protected int _x = 100;
protected int _y = 150;
// Abstract method
public abstract void AbstractMethod();
// Abstract properties
public abstract int X { get; }
public abstract int Y { get; }
}
class DerivedClass : BaseClass
{
public override void AbstractMethod()
{
_x++;
_y++;
}
public override int X // overriding property
{
get
{
return _x + 10;
}
}
public override int Y // overriding property
{
get
{
return _y + 10;
}
}
static void Main()
{
var o = new DerivedClass();
o.AbstractMethod();
Console.WriteLine($"x = {o.X}, y = {o.Y}");
}
}
// Output: x = 111, y = 161
Az előző példában, ha az absztrakt osztályt az alábbihoz hasonló utasítással próbálja példányosítani:
BaseClass bc = new BaseClass(); // Error
Hibaüzenet jelenik meg, amely szerint a fordító nem tudja létrehozni a "BaseClass" absztrakt osztály egy példányát.
C# nyelvi specifikáció
További információkért lásd a C# nyelvi specifikációját. A nyelvi specifikáció a C#-szintaxis és -használat végleges forrása.