Intereting Posts
Хороший пример того, как использовать UpdateSourceTrigger = Explicit с MVVM C #: redirect стандартного вывода процесса, который уже запущен Включение состояния сеанса в ASP.NET MVC арабское кодирование в itextsharp Ячейки DataGridview одного столбца не могут иметь разный тип передача параметров в stream Исключение исключений Nlog. Возможное объяснение – отсутствие нулевого аргумента и одного аргумента. Common.Logging.Configuration.NameValueCollection конструкторы Почему вызов AsEnumerable () в DataTable предотвращает привязку GridView к нему? ReportViewer – экспортировать отчет программно в определенное место, не показывая диалог сохранения Выбрасывание исключения Win32Exception сохранить строку с html как изображение Различия в разных способах создания параллельных программ Скрыть Start Orb на Vista / Win 7 в C # c #, чтобы найти точную разницу по дате, как в vb Динамически создавать отчет RDLC во время выполнения из DataGridView

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

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

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

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

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

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

Какая самая важная разница между абстрактными classами и статическими classами в C #?

Это больше походит на это.

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

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

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

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

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

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

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

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

Vehicle v = new Car(); 

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

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

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

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

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

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

  • Может наследовать от abstract не может наследовать от static
  • Может ли метод экземпляра на abstract не иметь экземпляра на static
  • abstract class может реализовать интерфейс, который static class не может

По сути, они пытаются служить двум различным целям

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

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

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

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

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