В чем разница между пространством имен, классом, объектом и экземпляром? - PullRequest
26 голосов
/ 04 мая 2009

Я читаю Heads First C # (это очень интересно и удобно для пользователя), но мне было интересно, есть ли у кого-нибудь полезная метафора для описания того, как пространства имен, классы, методы, свойства и т. Д. Все «сочетаются друг с другом»?

Является ли класс «Родитель» и «Метод» ребенком и т. Д. Или это более сложно?

Может ли пространство имен быть домом, а класс - комнатой (ванная), а метод - тем, что можно сделать в этой комнате (стирка и т. Д.), А свойствами - то, что можно сделать при выполнении этого действия, использовать мыло, горячую воду ...

... Я возьму свое пальто.

Ответы [ 10 ]

64 голосов
/ 04 мая 2009

Я бы сказал:

  • Пространство имен : категория или марка автомобилей. Обратите внимание, что бренд действительно не должен диктовать, как автомобиль построен. Нельзя сказать, что у Хонды всегда четыре двери или что у нее всегда 4wd. Такая специфика зависит от класса, чтобы диктовать. Пост Rich.Carpenter очень хорошо объясняет назначение пространств имен.

  • Класс : план создания конкретной машины.

  • Объект : фактический автомобиль (экземпляр), созданный из чертежа автомобиля (класс)

  • Метод : что-то, что может сделать пользователь автомобиля. Start(), IncreaseThrottle(), Brake(), OpenDoor() и т. Д.

  • Свойство : Атрибуты, информация и строительные блоки, которые содержит автомобиль. Например. Общее количество миль пробега, цвет, размер рулевого колеса, стереосистема и т. Д. И т. Д.

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

  • Наследование : Когда класс основан на другом классе и добавляет некоторые более конкретные детали. Линия наследования обычно проходит от наиболее распространенного и общего аспекта, вплоть до того момента, когда нет смысла быть более конкретным. Пример этого в контексте животных: Animal-> Mamal-> Rodent-> Rat-> RattusNorvegicus

  • Агрегаты : Свойства, которые "строят" объект. Например. «Этот автомобиль представляет собой совокупность четырех колес, шасси, двигателя и т. Д.».

  • Атрибут : Свойства, которые описывают объект, обычно не являются частью его физической конструкции. Например. Цвет, максимальная скорость, объем двигателя и т. Д.

  • Инкапсуляция : Концепция сокрытия определенных свойств от пользователя или защиты определенных свойств от неправильного использования (и, следовательно, повреждения объекта). Например. Вы не выставляете свойство gear класса автомобиля для свободного изменения. Вы инкапсулируете его и убедитесь, что Clutch() вызывается до SetGear().

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

  • Полиморфизм : сложная концепция для понимания, пока вы не начнете использовать ее практически. Это означает ссылку на очень специфический тип объекта, используя общую ссылку, которая позволяет вам игнорировать конкретный тип (когда вам не нужно его знать). Например. Если вы хотите «прочитать» номерной знак каждого транспортного средства на стоянке, вам все равно, какой это бренд, даже если это трейлер, мотоцикл или что-то еще. Чтобы сделать это, мы должны убедиться, что номерной знак является свойством в самом общем классе в строке наследования (вероятно, класс Vehicle). Таким образом, вам нужно иметь дело только со всеми объектами в списке, называя их классом Vehicle и вызывая Vehicle::GetLicensePlateNumber(). Любое транспортное средство, требующее некоторой специальной обработки для получения номера, может реализовать это поведение, переопределив метод и заставить его вести себя как требуется. Таким образом, широкий спектр типов объектов может использоваться, как если бы они были одного типа, но могут вести себя по-разному.

28 голосов
/ 04 мая 2009

Думайте о классах как об описании объектов, а методы как о действиях, которые эти объекты могут выполнять.

Например, я проектирую новую машину. Планы или чертежи (классы) для этого автомобиля - это то, что используется для создания реальных, физических автомобилей (объектов). Эти планы указывают на то, что автомобиль должен иметь функциональный гудок. Поэтому я разработал гудковую функциональность (метод) в автомобиле. Эти планы также указывают, что у машины четыре колеса. Колеса были бы свойством автомобиля с экземпляром (назначенным свойству при создании объекта) значением 4. Цвет был бы другим возможным свойством. Свойства описывают качества или характеристики объекта (цвет, высота, ширина и т. Д.).

Теперь я работаю на Тойоту (не совсем, но терпите меня). Тойота была бы пространством имен, которое включает мой автомобильный проект. Поскольку у Ford, GM и т. Д. Могут быть свои собственные конструкции автомобилей (классы), а также с одинаковыми именами (car) и методами (honk), пространства имен Toyota, Ford и GM разделяют эти чертежи (классы) и различаются, так как вы можете иметь несколько версий классов и методов с одним и тем же именем в приложении, когда они имеют разные пространства имен.

Надеюсь, это поможет.

13 голосов
/ 05 мая 2009

в одном предложении:

Объект - это Экземпляр класса

3 голосов
/ 05 мая 2009

Используя аналогию для домашних чертежей.

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

Объект - это дом, который вы строите по этому проекту. Вы можете иметь много домов, построенных по одной схеме. Все они имеют одинаковый общий вид и планировку, но свойства могут различаться, например, цвет наружной краски, стиль входной двери и т. Д. Входная дверь на всех домах одинакова.

Вы можете назвать каждый из этих домов экземплярами дома по определенному проекту.

Итак, как красноречиво сказано @ yx , объект является экземпляром класса.

2 голосов
/ 05 мая 2009

Объект может быть экземпляром класса?

2 голосов
/ 04 мая 2009

Я бы сказал, что ваши классы могут быть рабочими местами, выполнять различные действия (другими словами, действиями являются методы). У вас могут быть разные отдельные люди, выполняющие действия (различные экземпляры объектов).

Эти наборы вакансий будут находиться в отделе. У финансов есть свои рабочие места / классы (бухгалтеры, бухгалтеры ...), но им нужно будет работать с отделом продаж, у которого есть свои типы рабочих мест / классов.

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

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

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

Представьте, что несколько компаний работают вместе (пространства имен Microsoft .net работают с вашим собственным пространством имен), и вы получите более полную картину.

2 голосов
/ 04 мая 2009

Классы обычно используются для представления какого-либо объекта. Он может напоминать физический объект, такой как счет, но может быть и более абстрактным.

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

Классы могут быть разновидностью животных, таких как Cat и Dog. Когда вы создаете экземпляр класса, он становится конкретным объектом, таким как собака Фидо.

Пространства имен используются для логической группировки классов, поэтому классы Cat и Dog могут быть помещены в пространство имен Animals.Pets. Хотя пространства имен являются иерархическими, это не делает классы в них иерархическими. Это просто разные группы, поэтому классы в пространстве имен Animals не являются автоматически родителями классов в пространстве имен Animals.Pets.

Методы - это то, что делают объекты, например Eat() и Sleep().

Свойства - это то, что описывает аспект объекта, например NumberOfLegs и IsSleeping.

1 голос
/ 05 мая 2009

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

объект и экземпляр действительно одинаковы. Из шаблона класса вы можете создать множество экземпляров (или объектов) класса. Каждый из них имеет все члены и методы, определенные в классе, в своей собственной памяти (хотя у вас могут быть общие члены, а методы почти всегда совместно используются экземплярами).

1 голос
/ 05 мая 2009

Класс - это тип объекта. Например, вы можете иметь столько объектов одного класса, сколько захотите.

Экземпляр - это объект, и иногда оба термина используются взаимозаменяемо, поскольку во многих языках все объекты также являются экземплярами класса. Люди используют слово «экземпляр», чтобы ясно указать, что речь идет не о классе, а об объекте этого класса.

1 голос
/ 05 мая 2009

Класс определяет, как выглядит объект - какие данные он содержит, какие методы он имеет и с какими другими классами он связан.

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

...