Базовые вопросы
Назовите основные принципы ООП
Основные принципы ООП:
-
Инкапсуляция:
- Сокрытие внутренней реализации объекта и предоставление интерфейса для взаимодействия с ним.
-
Наследование:
- Возможность создания нового класса на основе существующего, с заимствованием свойств и методов.
-
Полиморфизм:
- Способность объектов разного типа обрабатывать данные через единый интерфейс.
-
Абстракция:
- Выделение общих характеристик объектов и создание абстрактных классов и интерфейсов.
Как принципы ООП реализованы в C# и какие ограничения есть у наследования?
ООП-принципы с примерами:
-
Инкапсуляция:
-
Сокрытие деталей реализации класса и предоставление доступа только к необходимым методам.
-
Пример: У класса
Carесть приватные поляengineиfuel, доступ к которым осуществляется через публичные методыstartEngine()иrefuel().
public class Car { private Engine engine; private int fuel; public void StartEngine() { // Logic to start engine } public void Refuel(int amount) { // Logic to refuel } } -
-
Наследование:
-
Создание нового класса на основе существующего, с заимствованием свойств и методов.
-
Пример: Класс
ElectricCarнаследует от классаCarи добавляет свои особенности.
public class ElectricCar : Car { public int BatteryLevel { get; set; } public void ChargeBattery(int amount) { // Logic to charge battery } } -
-
Полиморфизм:
-
Способность объектов разного типа обрабатывать данные через единый интерфейс.
-
Пример: Метод
Driveпринимает параметр типаCar, но может работать с объектамиElectricCarиGasCar.
public void Drive(Car car) { car.StartEngine(); // Drive logic } -
-
Абстракция:
-
Выделение общих характеристик объектов и создание абстрактных классов и интерфейсов.
-
Пример: Интерфейс
IVehicleопределяет методыStartEngineиDrive.
public interface IVehicle { void StartEngine(); void Drive(); } public class Car : IVehicle { public void StartEngine() { // Logic to start engine } public void Drive() { // Drive logic } } -
Дополнительные вопросы
-
От какого класса неявно наследуются все классы в .NET?
- Все классы неявно наследуются от класса
System.Object.
- Все классы неявно наследуются от класса
-
Разрешено ли множественное наследование в C#?
- В C# не разрешено множественное наследование классов, но разрешено множественное наследование интерфейсов.
Что такое рекурсия?
Рекурсия — это поведение функции, при котором она вызывает сама себя. Такие функции называются рекурсивными. В отличие от цикла, они не просто повторяются несколько раз, а работают «внутри» друг друга
Что такое лямбда-выражение?
Лямбда-выражение — это краткая форма записи анонимного метода, используемая для создания делегатов или выражений.
Пример:
Func<int, int, int> add = (a, b) => a + b;
Лямбда-выражение (a, b) => a + b описывает функцию, которая принимает два аргумента и возвращает их сумму.
Что такое параллельное программирование (многопоточность) и его назначение? Какие классы используются?
Параллельное программирование или многопоточность — это подход к разработке программ, при котором различные части кода выполняются параллельно в нескольких потоках. Это позволяет улучшить производительность программы, эффективно использовать ресурсы многопроцессорных систем, улучшить отзывчивость приложения и повысить его отказоустойчивость.
В .NET для реализации параллельного программирования существует несколько классов и инструментов, основными из которых являются:
-
Класс
Thread:-
Представляет поток выполнения в .NET.
-
Создание и управление потоками напрямую с помощью класса
Threadтребует определенного уровня низкоуровневых навыков и может быть не самым удобным способом реализации параллельного программирования.
-
-
Пространство имен
System.Threading.Tasks:-
Предоставляет более высокоуровневый и удобный способ работы с параллельными задачами.
-
Task представляет операцию, которая может завершиться в будущем. Она не обязана выполняться параллельно или занимать отдельный поток.
-
-
Пространство имен
System.Threading:- Содержит множество классов и методов для работы с многопоточностью, включая
ThreadPool,Mutex,Monitor,Semaphoreи другие.
- Содержит множество классов и методов для работы с многопоточностью, включая
-
Асинхронное программирование:
- Классы и методы для работы с асинхронным программированием, такие как ключевые слова
async/await, асинхронные методы и классыTaskиTask<T>, позволяют реализовать асинхронные операции без блокировки основного потока.
- Классы и методы для работы с асинхронным программированием, такие как ключевые слова
Использование этих классов и инструментов позволяет разработчикам создавать параллельные и асинхронные приложения в .NET, которые могут эффективно использовать мощности многопроцессорных систем и предоставлять более отзывчивый и отказоустойчивый пользовательский опыт.
Какие GoF-паттерны использовали?
Шаблоны проектирования GoF — это набор классических шаблонов проектирования, описанных в книге “Design Patterns: Elements of Reusable Object-Oriented Software”. В .NET разработке также используются различные шаблоны проектирования GoF для улучшения архитектуры и повышения гибкости приложений.
Ниже приведены некоторые из популярных GoF-паттернов, которые часто используются в .NET:
-
Паттерн Фабричный метод (
Factory Method):-
Используется для определения интерфейса создания объекта, но позволяет подклассам изменять тип создаваемого объекта.
-
В .NET его можно реализовать с помощью интерфейсов или абстрактных классов.
-
-
Паттерн Одиночка (
Singleton):-
Гарантирует, что класс имеет только один экземпляр, и предоставляет глобальный доступ к этому экземпляру.
-
Реализовать можно, например, с использованием статического поля и ленивой инициализации.
-
-
Паттерн Адаптер (
Adapter):-
Преобразует интерфейс одного класса в интерфейс другого класса, который клиентский код ожидает.
-
В .NET его можно использовать для адаптации различных интерфейсов или классов.
-
-
Паттерн Декоратор (
Decorator):-
Позволяет добавлять дополнительную функциональность объектам динамически.
-
Декоратор оборачивает объект с тем же интерфейсом и добавляет поведение до или после делегирования вызова. Методы расширения сами по себе этот паттерн не реализуют.
-