Junior
Kas kasutas oma projektides abstraktseid klasse?
sobes.tech AI
Vastus AI-lt
Jah, ma kasutan. Abstraktsed klassid kasutati põhistruktuuride loomisel koos üldiste meetodite ja omadustega, mis seejärel päranduvad konkreetsetele klassidele.
// Abstraktse klassi deklaratsioon
public abstract class Shape
{
// Abstraktne meetod, mida peavad rakendama pärandavad klassid
public abstract double GetArea();
// Virtuaalne meetod koos vaikimisi rakendusega, mida saab üle kirjutada
public virtual void Draw()
{
Console.WriteLine("Joonistatakse kuju.");
}
}
// Konkreetne klass, mis pärineb Shape
public class Circle : Shape
{
public double Radius { get; set; }
public Circle(double radius)
{
Radius = radius;
}
// Abstraktse meetodi rakendamine
public override double GetArea()
{
return Math.PI * Radius * Radius;
}
// Virtuaalse meetodi üle kirjutamine
public override void Draw()
{
Console.WriteLine($"Joonistatakse ring raadiusega {Radius}.");
}
}
Peamised stsenaariumid:
- Üldise lepingu määratlemine: Abstraktsed klassid võimaldavad määratleda meetodite ja omaduste komplekti, mis peavad olema kõigis pärandklassides.
- Osaline rakendus: Võimalus pakkuda osalist rakendust põhiklassis, vältides koodi täielikku dubleerimist pärandklassides.
- Mudel: Kasutatakse sageli disainimustrites nagu "Mudelimeetod".
Erinevused liidestega:
| Omadus | Abstraktne klass | Liides |
|---|---|---|
| Pärimine | Mitmepärimine on keelatud | Mitmepärimine on lubatud |
| Rakendamine | Võib sisaldada meetodite rakendusi | C# 8.0-ni - ainult deklaratsioonid, pärast - vaikimisi rakendus |
| Liikmed | Võib sisaldada välju, konstruktorid, virtuaalseid/abstraktseid/tavalisi meetodeid | C# 8.0-ni - ainult meetodid ja omadused, pärast - ka staatilised liikmed ja vaikimisi rakendused |
| Seisund | Võib omada seisundit (väljade kaudu) | Ei saa omada seisundit |