Junior
Ar naudojote abstrakčias klases savo projektuose?
sobes.tech AI
Atsakymas iš AI
Taip, naudoju. Abstraktūs klasės buvo naudojamos kuriant pagrindines struktūras su bendrais metodais ir savybėmis, kurios vėliau paveldimos konkrečiuose klasėse.
// Abstraktaus klasės deklaravimas
public abstract class Shape
{
// Abstraktus metodas, kuris turi būti įgyvendintas paveldėtuose klasėse
public abstract double GetArea();
// Virtualus metodas su numatytu įgyvendinimu, kurį galima perrašyti
public virtual void Draw()
{
Console.WriteLine("Brėžiama forma.");
}
}
// Konkreti klasė, paveldinti iš Shape
public class Circle : Shape
{
public double Radius { get; set; }
public Circle(double radius)
{
Radius = radius;
}
// Abstraktaus metodo įgyvendinimas
public override double GetArea()
{
return Math.PI * Radius * Radius;
}
// Perrašyti virtualų metodą
public override void Draw()
{
Console.WriteLine($"Brėžiama apskritimas su spinduliu {Radius}.");
}
}
Pagrindiniai scenarijai:
- Bendro kontrakto apibrėžimas: Abstraktūs klasės leidžia nustatyti metodų ir savybių rinkinį, kuris turi būti visose paveldėtose klasėse.
- Dalinis įgyvendinimas: Galimybė pateikti dalinį įgyvendinimą pagrindinėje klasėje, išvengiant visiško kodo dubliavimo paveldėtose klasėse.
- Dizaino šablonas: Dažnai naudojamas įgyvendinant šablonų, tokių kaip "Šablono metodas".
Skirtumai nuo sąsajų:
| Savybė | Abstrakti klasė | Sąsaja |
|---|---|---|
| Paveldėjimas | Draudžiama daugkartinė paveldėjimas | Leidžiama daugkartinė įgyvendinimas |
| Įgyvendinimas | Gali turėti įgyvendinimo metodus | Iki C# 8.0 - tik deklaracijos, po 8.0 - numatytasis įgyvendinimas |
| Nariai | Gali turėti laukus, konstruktorius, virtualius/abstrakčius/įprastus metodus | Iki C# 8.0 - tik metodai ir savybės, po 8.0 - taip pat statiniai nariai ir numatytosios įgyvendinimai |
| Būsena | Gali turėti būseną (per laukus) | Negali turėti būsenos |