Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Абстрактные классы и методы в C#: практическое руководство

Освоение абстрактных классов и методов в C#

Изучите абстрактные классы и методы C# через четкие примеры, паттерны наследования, конструкторы и реальные сценарии использования.

Абстрактный класс

В C# абстрактные классы служат шаблонами, которые нельзя инстанцировать напрямую. Ключевое слово abstract сигнализирует, что класс предназначен для наследования. Например:

// Определение абстрактного класса
abstract class Language {
    // Поля и методы
}
// Попытка создать экземпляр вызовет ошибку
// Language obj = new Language();

Абстрактный класс может содержать как абстрактные методы (объявления без тела), так и конкретные методы (полностью реализованные). Например:

abstract class Language {
    // Абстрактный метод — без тела
    public abstract void Display();
    // Конкретный метод — с реализацией
    public void DisplayInfo() {
        Console.WriteLine("Concrete method in abstract class");
    }
}

Перед продолжением убедитесь, что вы знакомы с концепциями наследования в C#.


Наследование абстрактного класса

Поскольку абстрактный класс нельзя инстанцировать напрямую, необходимо создать конкретный подкласс, производный от него. Подкласс наследует члены абстрактного класса, позволяя использовать их через объект производного класса. Пример:

using System;
namespace AbstractClassDemo {
    abstract class Language {
        public void Display() {
            Console.WriteLine("Concrete method in abstract class");
        }
    }
    // Конкретный подкласс
    class Program : Language {
        static void Main(string[] args) {
            Program prog = new Program();
            prog.Display();
            Console.ReadLine();
        }
    }
}

Вывод

Concrete method in abstract class

В примере Language абстрактен, а Program наследует от него и может вызывать Display(). Обратите внимание: абстрактные классы не могут быть sealed; они всегда должны служить базовыми типами.

Примечание: Используйте этот паттерн, когда нужен общий контракт, который будут реализовывать несколько производных типов.


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

Абстрактный метод объявляет сигнатуру без тела. Он обязывает производные, неабстрактные классы предоставить реализацию. Например:

public abstract void Display();

Только абстрактные классы могут содержать абстрактные методы. Когда конкретный подкласс наследует такой класс, он должен переопределить каждый абстрактный член, если только он сам не объявляется абстрактным.

Пример: Реализация абстрактного метода

using System;
namespace AbstractClassDemo {
    abstract class Animal {
        public abstract void MakeSound();
    }
    class Dog : Animal {
        public override void MakeSound() {
            Console.WriteLine("Bark Bark");
        }
    }
    class Program {
        static void Main(string[] args) {
            Dog dog = new Dog();
            dog.MakeSound();
            Console.ReadLine();
        }
    }
}

Вывод

Bark Bark

Здесь Animal объявляет абстрактный метод MakeSound(). Конкретный подкласс Dog предоставляет переопределение, выполняя контракт.

Примечание: Абстрактные методы неявно виртуальны; поэтому ключевое слово virtual избыточно и не допускается.


Абстрактные свойства с геттерами и сеттерами

Абстрактные аксессоры позволяют производным классам предоставлять пользовательскую логику для операций get и set свойств. Пример:

using System;
namespace AbstractClassDemo {
    abstract class Animal {
        protected string name;
        public abstract string Name { get; set; }
    }
    class Dog : Animal {
        public override string Name {
            get { return name; }
            set { name = value; }
        }
    }
    class Program {
        static void Main(string[] args) {
            Dog dog = new Dog();
            dog.Name = "Tom";
            Console.WriteLine("Name: " + dog.Name);
            Console.ReadLine();
        }
    }
}

Вывод

Name: Tom

Производный класс реализует абстрактное свойство, обеспечивая инкапсулированное управление состоянием.


Конструкторы в абстрактных классах

Абстрактные классы могут определять конструкторы для инициализации общего состояния для всех подклассов. При создании экземпляра подкласса конструктор абстрактного класса выполняется первым. Пример:

using System;
namespace AbstractClassDemo {
    abstract class Animal {
        public Animal() {
            Console.WriteLine("Animal Constructor");
        }
    }
    class Dog : Animal {
        public Dog() {
            Console.WriteLine("Dog Constructor");
        }
    }
    class Program {
        static void Main(string[] args) {
            Dog d1 = new Dog();
            Console.ReadLine();
        }
    }
}

Вывод

Animal Constructor
Dog Constructor

Подклассы также могут определять деструкторы, если нужна логика очистки.

Примечание: Конструкторы полезны для настройки общих ресурсов, требуемых всеми производными типами.


Абстракция в C# через абстрактные классы

Абстрактные классы предоставляют механизм абстракции: они скрывают детали реализации, выставляя чистый интерфейс. Это упрощает сложные системы, фокусируясь на «что», а не «как».

Рассмотрим реальную аналогию: тормозные системы мотоциклов. Внешнее поведение тормоза — замедление или остановка — одинаково, но внутренний механизм варьируется между моделями. Абстрактные классы позволяют каждой модели реализовать свою уникальную логику торможения без изменения внешнего контракта.

Пример: Тормоза мотоциклов

using System;
namespace AbstractClassDemo {
    abstract class MotorBike {
        public abstract void Brake();
    }
    class SportsBike : MotorBike {
        public override void Brake() {
            Console.WriteLine("Sports Bike Brake");
        }
    }
    class MountainBike : MotorBike {
        public override void Brake() {
            Console.WriteLine("Mountain Bike Brake");
        }
    }
    class Program {
        static void Main(string[] args) {
            SportsBike s1 = new SportsBike();
            s1.Brake();
            MountainBike m1 = new MountainBike();
            m1.Brake();
            Console.ReadLine();
        }
    }
}

Вывод

Sports Bike Brake
Mountain Bike Brake

Здесь MotorBike объявляет абстрактный метод Brake(). Каждый конкретный класс мотоцикла предоставляет свою реализацию, демонстрируя полиморфизм.

Примечание: Для полной абстракции — без базовой реализации — рассмотрите использование интерфейсов.

Язык C

  1. Классы и объекты в C#: Фундаменты надёжного ООП
  2. Частичные классы и методы в C#: понимание и применение
  3. Sealed-классы и sealed-методы в C#: когда использовать, примеры и повышение безопасности кода
  4. Классы и объекты в C++: практическое руководство по объектно-ориентированному программированию
  5. Дружественные функции и классы в C++: мастерство контроля доступа
  6. Классы и объекты в Java: практическое руководство
  7. Абстрактные классы и методы в Java: полное руководство
  8. Вложенные и внутренние классы в Java: типы, примеры и лучшие практики
  9. Абстрактные классы в C#: практическое руководство с примерами кода
  10. Java: объекты, классы и основные концепции ООП