Почему Суперкласс и Подкласс перепутаны? - PullRequest
20 голосов
/ 21 февраля 2010

В теории множеств множество является надмножеством, если оно содержит все в исходном множестве и, возможно, больше. Однако подмножество не содержит всего исходного набора.

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

Разве это не задом наперед? Подкласс наследует такие вещи, как все переменные экземпляра и методы, от своего суперкласса, таким образом, он «содержит» все от родителя, плюс все, что добавлено в подкласс. Это просто ошибка именования или это было сделано намеренно, и если да, то почему?

Ответы [ 7 ]

21 голосов
/ 21 февраля 2010

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

Набор возможных членов суперкласса является надмножеством набора возможных членов подкласса этого суперкласса.

7 голосов
/ 21 февраля 2010

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

  1. свойства и методы не относятся к отношениям sub / super с точки зрения теории множеств:

    • свойства и методы, определенные подклассом, могут выходить за пределы тех, которые предусмотрены его суперклассом (и фактически они часто так и делают), но экземпляры подкласса все еще являются членами набора экземпляров суперкласс
    • другими словами, отношение sub / super определяется не собственными свойствами и методами, а семантикой уровня экземпляра, предназначенной для именования классов
  2. Пример таксономии:

    • набор всех людей больше, чем набор всех программистов
    • набор People - это, по сути, расширенный набор программистов
    • Набор программистов является подмножеством набора Люди

так что с точки зрения ООП People будет суперклассом, а Programmer - подклассом. Каждый программист - это человек, но не каждый человек является программистом. Отсюда суперкласс и подкласс. Тот факт, что у класса Программиста могут быть сверхспособности за пределами мира смертных, не меняет семантику классовых отношений.

3 голосов
/ 23 февраля 2010

Грег ответил правильно. Вот объяснение на примере:

У вас есть базовый класс Base. У вас есть два производных класса DerivedA и DerivedB. Каждый экземпляр DerivedA также является экземпляром Base. Аналогично, каждый DerivedB также является Базой. Но DerivedA является , а не DerivedB и наоборот. Итак, если бы вы нарисовали диаграмму Венна вселенной всех возможных объектов, вы бы получили:

    ________________________
   /                        \
  /          Base            \
 /    ______        ______    \
|    /      \      /      \    |
|   /        \    /        \   |
|  | DerivedA |  | DerivedB |  |
|   \        /    \        /   |
|    \______/      \______/    |
 \                            /
  \                          /
   \________________________/

Другими словами, каждый объект в наборе объектов DerivedA равен и в наборе базовых объектов. Аналогично для DerivedB. Таким образом, Base действительно является надмножеством DerivedA и DerivedB. Следовательно, это «суперкласс».

2 голосов
/ 21 февраля 2010

Вероятно, по той же причине, по которой стеки растут (снизу вверху), деревья растут вниз (корень вверху), а 2D-графические системы почти всегда имеют квадрант IV (0,0 слева вверху).

1 голос
/ 03 апреля 2011

Да, но если вы думаете о своей диаграмме как о топографической карте, подклассы имеют более высокие высоты, чем суперкласс. Отсюда путаница.

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

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

1 голос
/ 21 февраля 2010

У подкласса есть все [члены] своего суперкласса [и более]. Разве это не задом наперед?

Эта проблема возникает во всех языках программирования, и это всегда заставляет мою голову болеть. (Подтип особенно).

Вот правила:

  • Когда вы рассматриваете объекты, у подкласса / потомка / подтипа есть больше методов и членов . Может использоваться в большем количестве контекстов . Это кажется нелогичным.

  • Когда вы рассматриваете контексты, интерфейсы или аргументы, роли меняются местами . Например, метод, ожидающий аргумент супертипа / parent / superclass , может принять больше аргументов , чем метод, ожидающий аргумент подтипа.

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

Если объявление класса рассматривается как спецификация , , тогда спецификация суперкласса удовлетворяется большим количеством объектов, а спецификация подкласса выполняется меньшим количеством объектов , Я считаю, что это причина номенклатуры. (Немного понятнее, если вы говорите о подтипах и супертипах & mdash; подтип содержит меньше значений, чем его супертип, поскольку каждое значение подтипа также является значением супертипа, а супертип, вероятно, заселен дополнительными значениями, которые не члены подтипа.)

Я уже говорил, что от этой темы у меня болит голова?

1 голос
/ 21 февраля 2010

Я обошёл всю проблему супер / подкласса и назвал их «производным» и «родительским» классом.

...