← Назад к вопросам

Что такое абстрактные методы в C#?

2.3 Middle🔥 141 комментариев
#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое абстрактные методы в C#?

Абстрактный метод — это метод в абстрактном классе, у которого определена только сигнатура (имя, параметры, тип возврата), но нет реализации. Абстрактные методы заставляют все производные классы предоставлять конкретную реализацию.

Основные характеристики

Определение абстрактного метода:

public abstract class DataProcessor
{
    // Абстрактный метод без реализации
    public abstract void ProcessData(List<double> data);
    
    // Обычный метод с реализацией
    public void LogMessage(string message)
    {
        Console.WriteLine(message);
    }
}

Реализация в производном классе:

public class NeuralNetworkProcessor : DataProcessor
{
    // Обязательная реализация абстрактного метода
    public override void ProcessData(List<double> data)
    {
        // Конкретная реализация для нейросетей
        Console.WriteLine("Processing with neural network...");
        foreach (var value in data)
        {
            var processed = Math.Sigmoid(value);
        }
    }
}

public class RandomForestProcessor : DataProcessor
{
    public override void ProcessData(List<double> data)
    {
        // Конкретная реализация для случайного леса
        Console.WriteLine("Processing with Random Forest...");
    }
}

Правила использования абстрактных методов

  1. Абстрактные методы только в абстрактных классах — не могут быть в обычном классе
  2. Обязательна реализация — производный класс должен переопределить все абстрактные методы
  3. Модификаторы доступа — обычно public, protected
  4. Множественное наследование интерфейсов — похожий механизм через интерфейсы

Абстрактные классы vs интерфейсы

Абстрактный класс (когда классы имеют общую функциональность):

public abstract class Model
{
    protected string Name { get; set; }
    
    public abstract double Predict(double[] features);
    
    public virtual void Train(List<double[]> data) 
    {
        Console.WriteLine($"Training {Name}...");
    }
}

Интерфейс (когда только контракт методов):

public interface IEstimator
{
    double Predict(double[] features);
    void Fit(double[][] X, double[] y);
}

Практический пример для Data Science

public abstract class MLModel
{
    public abstract double Evaluate(List<double> predictions, List<double> actual);
    public abstract List<double> Predict(double[][] features);
}

public class LinearRegressionModel : MLModel
{
    private double[] coefficients;
    
    public override List<double> Predict(double[][] features)
    {
        var predictions = new List<double>();
        foreach (var feature in features)
        {
            var prediction = coefficients[0];
            for (int i = 0; i < feature.Length; i++)
                prediction += coefficients[i + 1] * feature[i];
            predictions.Add(prediction);
        }
        return predictions;
    }
    
    public override double Evaluate(List<double> predictions, List<double> actual)
    {
        // Расчёт MSE
        double mse = 0;
        for (int i = 0; i < predictions.Count; i++)
            mse += Math.Pow(predictions[i] - actual[i], 2);
        return mse / predictions.Count;
    }
}

Когда использовать абстрактные методы

  • Создание иерархии моделей машинного обучения
  • Унификация интерфейса для разных алгоритмов
  • Обеспечение единого контракта для всех наследников
  • Применение паттерна Template Method