Ответ 1
Я хотел бы знать, каковы все различия между абстрактными классами и статическими классами на С#.
Не задавайте таких вопросов. Я мог потратить часы, перечисляя сотни различий, ни одна из которых не была бы релевантна для вас.
Какое самое важное различие между абстрактными классами и статическими классами в С#?
Это больше нравится.
Абстрактный класс обычно предназначен для моделирования чего-то в иерархии типов. Например, грузовик является своего рода транспортным средством, а самолёт является своего рода транспортным средством, поэтому у вас может быть базовый класс Vehicle и производные классы Truck and Airplane. Но "Транспортное средство" является абстрактным; нет транспортных средств, которые являются просто транспортными средствами, но не являются более конкретными вещами. Вы представляете эту концепцию с абстрактным классом.
Статический класс, напротив, не предназначен для моделирования чего-либо вообще. Это просто удобный способ хранения кучи кода. На самом деле это не должен быть класс; VB сделал лучший выбор, назвав такие вещи "модулями", а не "классами". Хотя технически они наследуются от объекта, статические классы логически не относятся к иерархии типов вообще. Это всего лишь ведро для хранения статических элементов.
Статические классы часто используются в качестве контейнеров методов расширения.
Когда я использую что и почему?
Используйте абстрактный класс, когда вы хотите построить модель формы "X - это вид Y". Например, "Автомобиль - это своего рода автомобиль" или "Квадрат - это своего рода форма", или "Журнал - это своего рода публикация", где "Y" является абстрактным понятием. Не используйте его для таких вещей, как "Сотрудник - это своего рода Личность". Человек должен быть конкретным. Человек не является абстрактным понятием; есть люди, которые являются просто людьми, но нет транспортных средств, которые не являются чем-то другим.
Используйте статический класс, если вы хотите использовать методы расширения, или когда у вас есть куча кода, который логически соединяется, но не связывается с каким-либо объектом. Например, если у вас есть куча связанных математических подпрограмм, это хороший кандидат для статического класса.
Верно ли, что абстрактный класс является классом, который мы не можем создать для него?
Нет. Это не true. Вы можете создавать экземпляры абстрактного класса. Вы делаете это, создавая экземпляр более производного класса.
Vehicle v = new Car();
Ясно, что v относится к экземпляру Vehicle, и поэтому вы можете создать экземпляр абстрактного класса. То, что вы не можете сделать, это создать экземпляр абстрактного класса, который также не является экземпляром более производного конкретного класса.
В отличие от этого, вы не можете создать экземпляр статического класса вообще.
Вот вопрос, который вы не задали:
Какова связь реализации между статическими классами и абстрактными классами?
Статические классы фактически не существуют как концепция в CLR. Когда вы говорите "static" в классе, то, что мы на самом деле делаем, это генерировать абстрактный закрытый класс без публичных конструкторов. Поскольку он абстрактный, вы не можете создать его напрямую. Поскольку он запечатан, вы не можете создать более производный класс и создать его.