Junior
Czy używałeś klas abstrakcyjnych w swoich projektach?
sobes.tech AI
Odpowiedź od AI
Tak, używałem tego. Klasy abstrakcyjne służyły do tworzenia podstawowych struktur z metodami i właściwościami wspólnymi, które następnie są dziedziczone przez konkretne klasy.
// Deklaracja klasy abstrakcyjnej
public abstract class Shape
{
// Metoda abstrakcyjna, którą muszą zaimplementować klasy dziedziczące
public abstract double GetArea();
// Metoda wirtualna z domyślną implementacją, którą można nadpisać
public virtual void Draw()
{
Console.WriteLine("Rysowanie kształtu.");
}
}
// Konkretna klasa dziedzicząca po Shape
public class Circle : Shape
{
public double Radius { get; set; }
public Circle(double radius)
{
Radius = radius;
}
// Implementacja metody abstrakcyjnej
public override double GetArea()
{
return Math.PI * Radius * Radius;
}
// Nadpisanie metody wirtualnej
public override void Draw()
{
Console.WriteLine($"Rysowanie koła o promieniu {Radius}.");
}
}
Główne scenariusze użycia:
- Definiowanie ogólnego kontraktu: Klasy abstrakcyjne pozwalają na zdefiniowanie zestawu metod i właściwości, które muszą występować we wszystkich klasach pochodnych.
- Częściowa implementacja: Możliwość dostarczenia częściowej implementacji funkcjonalności w klasie bazowej, unikając pełnej duplikacji kodu w klasach dziedziczących.
- Wzorzec projektowy: Często używane w implementacji wzorców, takich jak "Metoda szablonowa".
Różnice w porównaniu do interfejsów:
| Cecha | Klasa abstrakcyjna | Interfejs |
|---|---|---|
| Dziedziczenie | Dziedziczenie wielokrotne zabronione | Wielokrotna implementacja dozwolona |
| Implementacja | Może zawierać implementację metod | Do C# 8.0 - tylko deklaracje, po tym - domyślne implementacje |
| Członkowie | Może mieć pola, konstruktory, metody wirtualne/abstrakcyjne/normalne | Do C# 8.0 - tylko metody i właściwości, po tym - także członkowie statyczni i domyślne implementacje |
| Stan | Może mieć stan (przez pola) | Nie może mieć stanu |