Junior
Използвали ли сте абстрактни класове в проектите си?
sobes.tech AI
Отговор от AI
Да, използвал съм. Абстрактните класове се използваха за създаване на основни структури с общи методи и свойства, които след това се наследяват от конкретни класове.
// Обявяване на абстрактен клас
public abstract class Shape
{
// Абстрактен метод, който трябва да бъде реализиран в наследяващите класове
public abstract double GetArea();
// Виртуален метод с реализация по подразбиране, който може да бъде презаписан
public virtual void Draw()
{
Console.WriteLine("Рисуване на форма.");
}
}
// Конкретен клас, наследяващ от Shape
public class Circle : Shape
{
public double Radius { get; set; }
public Circle(double radius)
{
Radius = radius;
}
// Реализация на абстрактния метод
public override double GetArea()
{
return Math.PI * Radius * Radius;
}
// Презаписване на виртуалния метод
public override void Draw()
{
Console.WriteLine($"Рисуване на кръг с радиус {Radius}.");
}
}
Основни сценарии за използване:
- Определяне на общ договор: Абстрактните класове позволяват да се зададе набор от методи и свойства, които трябва да присъстват във всички наследени класове.
- Частична реализация: Възможност за предоставяне на частична реализация на функционалността в базовия клас, като се избягва пълното дублиране на кода в наследяващите класове.
- Шаблонен модел: Често се използват при реализирането на шаблони, като "Шаблонен метод".
Разлики с интерфейсите:
| Характеристика | Абстрактен клас | Интерфейс |
|---|---|---|
| Наследяване | Множествено наследяване е забранено | Множествена реализация е разрешена |
| Реализация | Може да съдържа реализация на методи | До C# 8.0 - само декларации, след това - реализация по подразбиране |
| Членове | Може да има полета, конструктори, виртуални/абстрактни/обикновени методи | До C# 8.0 - само методи и свойства, след това - също статични членове и реализация по подразбиране |
| Състояние | Може да има състояние (чрез полета) | Не може да има състояние |