Подтвердить что ты не робот

Почему суперкласс и подкласс отменены?

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

  • свойства и методы не имеют отношения к отношениям sub/super в терминах теории множеств:

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Вот правила:

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

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

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

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

Я упоминал, что вся тема заставляет мою голову болеть?

Ответ 7

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

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

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