Почему Суперкласс и Подкласс инвертируются?

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

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

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

20
задан jbrennan 21 February 2010 в 00:38
поделиться

6 ответов

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

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

21
ответ дан 30 November 2019 в 00:09
поделиться

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

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

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

    • множество всех Людей больше, чем множество всех Программистов
    • множество Люди, фактически, является надмножеством множества Программисты
    • множество Программисты является подмножеством множества Люди

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

7
ответ дан 30 November 2019 в 00:09
поделиться

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

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

Вот правила:

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

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

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

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

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

1
ответ дан 30 November 2019 в 00:09
поделиться

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

1
ответ дан 30 November 2019 в 00:09
поделиться

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

2
ответ дан 30 November 2019 в 00:09
поделиться

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

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

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

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

3
ответ дан 30 November 2019 в 00:09
поделиться