В теории множеств набор является надмножеством, если это содержит все в исходном наборе и возможно больше. Подмножество однако, не содержит все начального набора.
Имея это в виду, на большинстве языков объектно-ориентированного программирования (я думаю Objective C, но я знаю, то же верно для Java и других), родительский класс называют super
класс и любой класс, который наследовался супер, называют a subclass
.
Разве это не назад? Подкласс наследовал вещи как все переменные экземпляра и методы от его суперкласса, таким образом он "содержит" все от родителя, плюс то, что добавляется в подклассе. Это - просто ошибка именования, или действительно ли это было намеренным, и раз так почему?
Суперкласс определяет класс, который имеет больший набор возможных значений в качестве членов. Подкласс ограничивает элементы, которые могут быть частью его класса, поэтому он определяет меньший набор возможных членов.
Набор возможных членов суперкласса - это надмножество набора возможных членов подкласса этого суперкласса.
Грег прав. Две вещи, которые можно рассмотреть, чтобы сделать это более понятным:
свойства и методы не имеют отношения к отношениям sub/super с точки зрения теории множеств:
Пример таксономии:
поэтому в терминах ООП, Люди были бы суперклассом, а Программист - подклассом. Каждый программист является человеком, но не каждый человек является программистом. Отсюда суперкласс и подкласс. Тот факт, что класс Программист может обладать сверхспособностями, недоступными смертным людям, не меняет семантику отношений класс-класс (is-a).
У подкласса есть все [члены] его суперкласса [и другие]. Разве это не наоборот?
Эта проблема возникает во всех языках программирования, и у меня всегда болит голова. (Особенно подтип.)
Вот правила:
Когда вы рассматриваете объекты, подкласс / дочерний / подтип имеет на больше методов и членов . Его можно использовать в других контекстах . Это кажется нелогичным.
Когда вы рассматриваете контексты, интерфейсы или аргументы, роли меняются местами .Например, метод, ожидающий аргумент супертипа / родительского / суперкласса , может принимать больше аргументов , чем метод, ожидающий аргумент подтипа.
Какой из них находится наверху, полностью зависит от того, считаете ли вы объектов первичными или контекстов, ожидающих объектов , первичными. Я изучаю этот предмет почти 15 лет, и до сих пор интуиция меня не подводит.
Если объявление класса рассматривается как спецификация , , тогда спецификация суперкласса удовлетворяется на больше объектов, а спецификация подкласса удовлетворяется меньшим количеством объектов. Я считаю, что это причина номенклатуры. (Это немного яснее, если вы говорите о подтипах и супертипах - подтип населен меньшим количеством значений, чем его супертип, потому что каждое значение подтипа также является значением супертипа, а супертип, вероятно, населен дополнительными значениями, которые не принадлежат к подтипу.)
Я упоминал, что от этой темы у меня болит голова?
Я обошел всю проблему суперкласса / подкласса и назвал их "производным" и "родительским" классами.
Вероятно, по той же причине, по которой стеки растут вниз (низ вверху), деревья растут вниз (корень вверху), а 2D графические системы почти всегда находятся в квадранте IV (0,0 в верхнем левом углу).
Ответ Грега правильный. Вот объяснение на примере:
У вас есть базовый класс Base. У вас есть два производных класса DerivedA и DerivedB. Каждый экземпляр DerivedA также является экземпляром Base. Аналогично, каждый DerivedB также является Base. Но DerivedA - это не DerivedB и наоборот. Таким образом, если нарисовать диаграмму Венна вселенной всех возможных объектов, то получится:
________________________
/ \
/ Base \
/ ______ ______ \
| / \ / \ |
| / \ / \ |
| | DerivedA | | DerivedB | |
| \ / \ / |
| \______/ \______/ |
\ /
\ /
\________________________/
Другими словами, каждый объект из множества объектов DerivedA является также объектом из множества объектов Base. Аналогично для DerivedB. Таким образом, Base действительно является супермножеством как DerivedA, так и DerivedB. Следовательно, он является "суперклассом".