abstract (Referenční dokumentace jazyka C#)
abstract
Modifikátor označuje, že změněná věc má chybějící nebo neúplnou implementaci. Abstraktní modifikátor lze použít s třídami, metodami, vlastnostmi, indexery a událostmi. abstract
Modifikátor v deklaraci třídy slouží k označení, že třída je určena pouze jako základní třída jiných tříd, nikoli vytvoření instance sama. Členy označené jako abstraktní musí být implementovány ne abstraktní třídy, které jsou odvozeny z abstraktní třídy.
Příklad 1
V tomto příkladu musí třída Square
poskytnout implementaci GetArea
, protože je odvozena z Shape
:
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
Abstraktní třídy mají následující funkce:
Abstraktní třídu nelze vytvořit instanci.
Abstraktní třída může obsahovat abstraktní metody a přístupové objekty.
Abstraktní třídu s zapečetěným modifikátorem není možné upravit, protože tyto dva modifikátory mají opačný význam.
sealed
Modifikátor zabraňuje dědění třídy aabstract
modifikátor vyžaduje, aby byla zděděna třída.Abstraktní třída odvozená z abstraktní třídy musí obsahovat skutečné implementace všech zděděných abstraktních metod a přístupových objektů.
abstract
Použijte modifikátor v metodě nebo deklaraci vlastnosti k označení, že metoda nebo vlastnost neobsahuje implementaci.
Abstraktní metody mají následující funkce:
Abstraktní metoda je implicitně virtuální metoda.
Deklarace abstraktní metody jsou povoleny pouze v abstraktních třídách.
Vzhledem k tomu, že deklarace abstraktní metody neposkytuje žádnou skutečnou implementaci, neexistuje žádný tělo metody; deklarace metody jednoduše končí středníkem a za podpisem nejsou žádné složené závorky ({ }). Příklad:
public abstract void MyMethod();
Implementace je poskytována přepsáním metody, která je členem ne abstraktní třídy.
Jedná se o chybu použití statických nebo virtuálních modifikátorů v abstraktní deklaraci metody.
Abstraktní vlastnosti se chovají jako abstraktní metody, s výjimkou rozdílů v deklaraci a syntaxi vyvolání.
Jedná se o chybu použití modifikátoru
abstract
u statické vlastnosti.Abstraktní zděděná vlastnost lze přepsat v odvozené třídě zahrnutím deklarace vlastnosti, která používá modifikátor přepsání .
Další informace o abstraktních třídách naleznete v tématu Abstraktní a zapečetěné třídy a členy třídy.
Abstraktní třída musí poskytovat implementaci pro všechny členy rozhraní.
Abstraktní třída, která implementuje rozhraní, může mapovat metody rozhraní na abstraktní metody. Příklad:
interface I
{
void M();
}
abstract class C : I
{
public abstract void M();
}
Příklad 2
V tomto příkladu je třída DerivedClass
odvozena z abstraktní třídy BaseClass
. Abstraktní třída obsahuje abstraktní metodu , AbstractMethod
a dvě abstraktní vlastnosti, X
a Y
.
// 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
Pokud se v předchozím příkladu pokusíte vytvořit instanci abstraktní třídy pomocí příkazu, který je podobný tomuto:
BaseClass bc = new BaseClass(); // Error
Zobrazí se chyba s informací, že kompilátor nemůže vytvořit instanci abstraktní třídy BaseClass.
Specifikace jazyka C#
Další informace najdete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.