День сто тринадцатый. #ВопросыНаСобеседовании
Самые часто задаваемые вопросы на собеседовании по C#
4. Чем отличается интерфейс от абстрактного класса в C#?
Это, вероятно, самый часто задаваемый вопрос в мире .Net. Теоретически между абстрактным классом и интерфейсом есть 5 отличий, которые перечислены ниже:
1. Класс может реализовывать любое количество интерфейсов, но дочерний класс может наследовать только от одного абстрактного класса.
2. Абстрактный класс может иметь неабстрактные (конкретные) методы, в то время как в случае интерфейса все методы должны быть абстрактными. (Начиная с C# 8 допускается реализация по умолчанию интерфейсных методов).
3. Абстрактный класс может объявлять или использовать любые переменные, в то время как интерфейсу это запрещено. То есть следующий код приведёт к ошибке компиляции "Interfaces cannot contain fields" ("Интерфейсы не могут содержать полей"):
5. Абстрактный класс может иметь все модификаторы доступа для всех своих объявлений членов, в то время как в интерфейсе мы не можем объявлять никаких модификаторов доступа для членов (включая
Самые часто задаваемые вопросы на собеседовании по C#
4. Чем отличается интерфейс от абстрактного класса в C#?
Это, вероятно, самый часто задаваемый вопрос в мире .Net. Теоретически между абстрактным классом и интерфейсом есть 5 отличий, которые перечислены ниже:
1. Класс может реализовывать любое количество интерфейсов, но дочерний класс может наследовать только от одного абстрактного класса.
2. Абстрактный класс может иметь неабстрактные (конкретные) методы, в то время как в случае интерфейса все методы должны быть абстрактными. (Начиная с C# 8 допускается реализация по умолчанию интерфейсных методов).
3. Абстрактный класс может объявлять или использовать любые переменные, в то время как интерфейсу это запрещено. То есть следующий код приведёт к ошибке компиляции "Interfaces cannot contain fields" ("Интерфейсы не могут содержать полей"):
interface TestInterface4. Абстрактный класс может иметь объявление конструктора, а интерфейс нет. Возникает аналогичная пункту 3 ошибка компиляции "Interfaces cannot contain constructors" ("Интерфейсы не могут содержать конструкторов")
{
int x = 4; // Неверное объявление в интерфейсе
void getMethod();
string getName();
}
abstract class TestAbstractClass
{
int i = 4;
int k = 3;
public abstract void getClassName();
}
5. Абстрактный класс может иметь все модификаторы доступа для всех своих объявлений членов, в то время как в интерфейсе мы не можем объявлять никаких модификаторов доступа для членов (включая
public
), так как все члены интерфейса неявно открытые. Следующий код приведёт к ошибке компиляции "The modifier 'public' is not valid for this item" ("Модификатор 'public' недопустим для этого элемента"):interface TestInterfaceИсточник: https://www.c-sharpcorner.com
{
public void getMethod();
public string getName();
}