Абстрактные классы против статических классов в C# [дубликат]

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

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

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

4 ответов


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

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

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

это больше похоже на правду.

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

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

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

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

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

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

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

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

Vehicle v = new Car();

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

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

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

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

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


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

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

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

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

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

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


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

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