День сто тринадцатый. #ВопросыНаСобеседовании

Самые часто задаваемые вопросы на собеседовании по C#

4. Чем отличается интерфейс от абстрактного класса в C#?

Это, вероятно, самый часто задаваемый вопрос в мире .Net. Теоретически между абстрактным классом и интерфейсом есть 5 отличий, которые перечислены ниже:

1. Класс может реализовывать любое количество интерфейсов, но дочерний класс может наследовать только от одного абстрактного класса.

2. Абстрактный класс может иметь неабстрактные (конкретные) методы, в то время как в случае интерфейса все методы должны быть абстрактными. (Начиная с C# 8 допускается реализация по умолчанию интерфейсных методов).

3. Абстрактный класс может объявлять или использовать любые переменные, в то время как интерфейсу это запрещено. То есть следующий код приведёт к ошибке компиляции "Interfaces cannot contain fields" ("Интерфейсы не могут содержать полей"):

interface TestInterface  

{

int x = 4; // Неверное объявление в интерфейсе

void getMethod();

string getName();

}

abstract class TestAbstractClass

{

int i = 4;

int k = 3;

public abstract void getClassName();

}

4. Абстрактный класс может иметь объявление конструктора, а интерфейс нет. Возникает аналогичная пункту 3 ошибка компиляции "Interfaces cannot contain constructors" ("Интерфейсы не могут содержать конструкторов")

5. Абстрактный класс может иметь все модификаторы доступа для всех своих объявлений членов, в то время как в интерфейсе мы не можем объявлять никаких модификаторов доступа для членов (включая public), так как все члены интерфейса неявно открытые. Следующий код приведёт к ошибке компиляции "The modifier 'public' is not valid for this item" ("Модификатор 'public' недопустим для этого элемента"):

interface TestInterface  

{

public void getMethod();

public string getName();

}



Источник: https://www.c-sharpcorner.com