что такое член против собственности - PullRequest
32 голосов
/ 05 августа 2009

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

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

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

Ответы [ 9 ]

55 голосов
/ 05 августа 2009

Свойство один вид члена. Другими могут быть конструкторы, методы, поля, вложенные типы, преобразования, индексаторы и т. Д. - в зависимости от языка / платформы, конечно. Большую часть времени точное значение терминологии зависит от контекста.

Чтобы дать C # -специфическое определение , из спецификации C # 3.0, раздел 1.6.1:

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

  • Константы
  • Поля
  • Методы
  • Свойства
  • Индексаторы
  • События
  • Операторы
  • Конструкторы
  • деструкторы
  • Типы

Обратите внимание, что это члены класса . Разные «вещи» имеют разные типы членов - например, в C # интерфейс не может иметь поле в качестве члена.

6 голосов
/ 08 августа 2009

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

Лишь очень небольшое количество языков программирования имеет концепцию, называемую свойство или member , и еще меньше имеют оба.

Некоторыми примерами языков, у которых есть один из двух, являются C ++ (который имеет члены), ECMAScript (который имеет свойства) и C # (который имеет оба). Однако эти термины не обязательно обозначают одни и те же понятия в разных языках программирования. Например, термин «член» означает примерно одно и то же в C ++ и C #, но термин «свойство» означает совершенно разные вещи в ECMAScript и C #. Фактически, термин «свойство» в ECMAScript обозначает примерно то же самое понятие (то есть означает примерно то же самое), что и термин «член» в C ++ и C #.

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

4 голосов
/ 05 августа 2009

Свойства - один вид членов.

Например, в C # класс может иметь следующие члены:

  • Конструкторы
  • деструкторы
  • Константы
  • Поля
  • Методы
  • Свойства
  • Индексаторы
  • Операторы
  • События
  • Делегаты
  • Классы
  • Интерфейсы
  • * 1030 Структуры *

MSDN: C #: класс

1 голос
/ 05 августа 2009

И свойства, и методы являются членами объекта. Свойство описывает некоторый аспект объекта, когда метод обращается к объекту-владельцу или использует его.
Пример в псевдокоде:

Object Ball
Property color(some Value)
Method bounce(subroutine describing the movement of the Ball)

Если шар определен и ему присвоен цвет (свойство), в то время как метод bounce - это подпрограмма, описывающая, как шар будет реагировать на удар другого объекта. Не у всех языков есть свойства, т. Е. У Java есть только поля, к которым должны обращаться геттеры и сеттеры.

1 голос
/ 05 августа 2009

Свойства - это способ раскрытия полей, где поля являются фактическими переменными. Например (C #):

class Foo {
  private int field;
  public int Property {
    get { return field; }
    set { field = value; }
  }
}
1 голос
/ 05 августа 2009

Член (переменная) - это просто некоторая часть объекта. Свойство есть (я буду квалифицировать это как «обычно» - я не уверен, что это технически понятное слово, имеющее однозначное значение на нескольких языках) - это общедоступный аспект объекта, например, через методы получения и установки.

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

public class Foo {
  public String getJunk()
  { return "Junk";}

  public void setJunk(String ignore){;}
  }
}
1 голос
/ 05 августа 2009

Члены - это просто объекты или примитивные типы, принадлежащие классу.

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

Это относится к C #. Не уверен, правда ли это для других языков.

0 голосов
/ 16 июня 2016

Член - это общий термин (вероятно, возникший в C ++ , но также определенный в Java ), используемый для обозначения компонента класса. Свойство - это широкое понятие, используемое для обозначения определенной характеристики класса, которая после создания экземпляра поможет определить состояние объекта.

Следующие отрывки, извлеченные из «Объектно-ориентированный анализ и проектирование» от Грейди Буч , помогают прояснить предмет. Во-первых, важно понимать понятия состояния и поведения:

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

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

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

Поле терминов (Object Pascal), переменная экземпляра (Smalltalk), объект-член (C ++) и слот (CLOS) являются взаимозаменяемыми , что означает хранилище для части состояния объекта. В совокупности они составляют структуру объекта.

Операция над объектом, определенная как часть объявления класса. Термины сообщение (Smalltalk), метод (многие языки OO), функция-член (C ++) и операция обычно взаимозаменяемы.

Но введенная автором запись точна:

Атрибут обозначает часть совокупного объекта и поэтому используется во время анализа и проектирования для выражения особого свойства класса. Используя не зависящий от языка синтаксис, атрибут может иметь имя, класс или оба, и, необязательно, выражение по умолчанию: A:C=E.

Операция обозначает некоторую услугу, предоставляемую классом. Операции (...) отличаются от атрибутов добавлением скобок или предоставлением полной подписи операции, состоящей из возвращаемого класса, имени и формальных аргументов (если есть): R N(Arguments)

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

Приветствия

0 голосов
/ 08 августа 2013

из Руководство по PHP :

Переменные-члены класса называются «свойствами». Вы также можете увидеть их с использованием других терминов, таких как «атрибуты» или «поля». Они определяются с использованием одного из ключевых слов public, protected или private, за которым следует обычное объявление переменной. Эта декларация может включать инициализацию.

...