Подтвердить что ты не робот

Абстрактные классы vs Статические классы в С#

Возможный дубликат:
В чем разница между абстрактным классом и статическим?

Здравствуйте
Я хотел бы знать, что все различия между абстрактными классами и статическими классами в С#
Когда я использую что и почему?

Верно ли, что абстрактный класс является классом, который мы не можем создать для него? Благодаря

4b9b3361

Ответ 1

Я хотел бы знать, каковы все различия между абстрактными классами и статическими классами на С#.

Не задавайте таких вопросов. Я мог потратить часы, перечисляя сотни различий, ни одна из которых не была бы релевантна для вас.

Какое самое важное различие между абстрактными классами и статическими классами в С#?

Это больше нравится.

Абстрактный класс обычно предназначен для моделирования чего-то в иерархии типов. Например, грузовик является своего рода транспортным средством, а самолёт является своего рода транспортным средством, поэтому у вас может быть базовый класс Vehicle и производные классы Truck and Airplane. Но "Транспортное средство" является абстрактным; нет транспортных средств, которые являются просто транспортными средствами, но не являются более конкретными вещами. Вы представляете эту концепцию с абстрактным классом.

Статический класс, напротив, не предназначен для моделирования чего-либо вообще. Это просто удобный способ хранения кучи кода. На самом деле это не должен быть класс; VB сделал лучший выбор, назвав такие вещи "модулями", а не "классами". Хотя технически они наследуются от объекта, статические классы логически не относятся к иерархии типов вообще. Это всего лишь ведро для хранения статических элементов.

Статические классы часто используются в качестве контейнеров методов расширения.

Когда я использую что и почему?

Используйте абстрактный класс, когда вы хотите построить модель формы "X - это вид Y". Например, "Автомобиль - это своего рода автомобиль" или "Квадрат - это своего рода форма", или "Журнал - это своего рода публикация", где "Y" является абстрактным понятием. Не используйте его для таких вещей, как "Сотрудник - это своего рода Личность". Человек должен быть конкретным. Человек не является абстрактным понятием; есть люди, которые являются просто людьми, но нет транспортных средств, которые не являются чем-то другим.

Используйте статический класс, если вы хотите использовать методы расширения, или когда у вас есть куча кода, который логически соединяется, но не связывается с каким-либо объектом. Например, если у вас есть куча связанных математических подпрограмм, это хороший кандидат для статического класса.

Верно ли, что абстрактный класс является классом, который мы не можем создать для него?

Нет. Это не true. Вы можете создавать экземпляры абстрактного класса. Вы делаете это, создавая экземпляр более производного класса.

Vehicle v = new Car();

Ясно, что v относится к экземпляру Vehicle, и поэтому вы можете создать экземпляр абстрактного класса. То, что вы не можете сделать, это создать экземпляр абстрактного класса, который также не является экземпляром более производного конкретного класса.

В отличие от этого, вы не можете создать экземпляр статического класса вообще.

Вот вопрос, который вы не задали:

Какова связь реализации между статическими классами и абстрактными классами?

Статические классы фактически не существуют как концепция в CLR. Когда вы говорите "static" в классе, то, что мы на самом деле делаем, это генерировать абстрактный закрытый класс без публичных конструкторов. Поскольку он абстрактный, вы не можете создать его напрямую. Поскольку он запечатан, вы не можете создать более производный класс и создать его.

Ответ 2

Верно, что создать экземпляр класса abstract или static невозможно, но о том, где сходство заканчивается.

  • Can inherit from abstract не может наследовать от static
  • Может ли метод экземпляра на abstract не иметь экземпляр на static
  • Класс abstract может реализовать интерфейс a static класс не может

В основном они пытаются использовать две разные цели

  • Класс abstract формирует синюю печать/шаблон, который затем реализуется в производных классах по разным и (надеюсь) прозрачным образом.
  • Класс static - это просто контейнер для набора возможных связанных методов static

Ответ 3

Класс abstract - это класс, который должен быть унаследован для использования — это может быть только унаследовано. Вы можете создавать экземпляры классов, которые наследуют его.

A static class - это класс, который не может иметь экземпляры вообще; такой класс имеет только члены static.
static классы не могут быть унаследованы и не могут наследовать другие классы.

Ответ 4

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

Статический класс - это тот, который создается при необходимости CLR. В любой момент может быть только один экземпляр. Использование статических классов очень полезно, но следует заботиться о потоковом и одновременном доступе.