Is-a, расширяет, «наследует»: каков ваш предпочитаемый термин «наследование» и почему? - PullRequest
0 голосов
/ 27 октября 2009

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

У нас есть "is-a", "extends", "производные", "подклассы" и просто "наследует"

Слова, которые мы выбираем, имеют много значения. Какой ваш предпочитаемый термин для «наследования» и почему?

Будь неотразимым!

Ответы [ 9 ]

4 голосов
/ 27 октября 2009

Я чаще всего использую «подклассы B» (очень прямые) или «наследует от B» (скромно более обходные). «extends» - это хорошо в языках, где это ключевое слово, такое как Java, но по какой-то причине использование его для (скажем) C ++ или Python кажется немного растянутым. «IS-A» - это ограничение отношений, которое должно уважать наследование (принцип Лискова) и которое сохраняется между экземплярами (левая сторона) и классами (правая сторона) - так что вы можете сказать «x IS-A Foo» (когда x - это экземпляр Foo или любого подкласса Foo), но «Bar IS-A Foo» (где они оба класса) кажутся неправильными, это может привести к путанице в языках, где классы также являются экземплярами (мета) классов, таких как Python.

3 голосов
/ 27 октября 2009

Я бы хотел сказать производное , поскольку оно сильно подразумевает отношение класс / подкласс, но было бы достаточно точным в более экзотических случаях, таких как множественное наследование, реализация интерфейса и миксины.

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

1 голос
/ 27 октября 2009

Мне нравится пнуть его в старой школе и сказать «А подразумевает Б» или «А меньше Б». Они не являются двусмысленными, как и другие термины, т. Е. Имеют точное значение.

Сноска. Иногда я говорю "лучше чем" и "хуже чем" для обозначения отношений супертипа и подтипа соответственно. Я делаю это для устранения неоднозначности этого отношения, когда неясно, что рассматриваемые объекты являются типами. Я унаследовал эту привычку от Эдварда Кметта.

См. Здесь.

1 голос
/ 27 октября 2009

Я скажу здесь, что простота - это хорошо. Я все за "A Is a B", когда ссылаюсь на подкласс (A), который, очевидно, является экземпляром родительского класса (B) (собака является млекопитающим и т. Д.). Если отношения не так просты, я предпочитаю просто сказать: «А является подклассом B».

Состав класса явно усложняет идею «A Is a B», поэтому, очевидно, существует время, когда «A имеет B» или «A имеет B» легче понять.

Для простоты, я предпочитаю сказать, что класс соответствует протоколу или реализует интерфейс (хотя я не слишком много программирую на java).

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

1 голос
/ 27 октября 2009

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

Моя предпочтительная терминология - «подклассы» или «расширяет» для классов и «реализует» для интерфейсов. (В Objective-C каждый «принимает» или «соответствует» протоколу, вдохновляющему интерфейсы Java.) Часто я использую «parent» и «child» для описания самих отношений.

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

1 голос
/ 27 октября 2009

Вот терминология, которую я предпочитаю:

  • A наследуется от B - это самый простой и точный метод.
  • A является производным от B - Это полезно для общего описания случаев, когда A наследует B или от какого-либо другого класса, производного от B.

Вот терминология, которая мне не нравится:

  • A расширяет B - Это не совсем точно, потому что класс может быть производным от другого класса, и просто делать вещи по-другому, не расширяя его буквально. Он также часто используется для описания отношений между интерфейсами.
  • A подклассы B - Наследование не ограничивается только классами.
  • A - это B - Если A наследует от B, это не обязательно то же самое, что B, если только он не может быть использован на законных основаниях везде, где можно использовать B. Если предварительные условия контракта на разработку и постусловия виртуальной функции не будут должным образом ослаблены и усилены в новом классе, технически A не является B, поскольку нарушает принцип замены Лискова .
1 голос
/ 27 октября 2009

Есть два способа думать о наследовании:

is-a: полиморфизм - это когда интерфейс определяется базовым классом, но реализация может быть предоставлена ​​унаследованным классом.

public class Polygon
{
   public abstract int Points();
};

public class Triangle : Polygon
{
  public override int Points() { return 3; }
}

void Foo( Polygon p )
{
  int points = p.Points();
}

main()
{
   Foo( new Triangle() );
}

extends - способ захвата совместной реализации.

public class iTouch
{
    // cool pda features
}

public class iPhone : private iTouch
{
    // phone features
    // cool pda features comes from the base class
}
1 голос
/ 27 октября 2009

Существуют разные термины на разных языках.

"is" подходит для динамических языков и отражает химерные качества объектов perl / php / python и javascript. Лэсси - Собака, Млекопитающее, Домашнее животное, Кинозвезда, также является активом MGM.

"extends" подходит для декларативной строгой типизации природы Java (и отсутствия множественного наследования!). «Ласси расширяет пса», Ласси может ходить и лаять, но не может сниматься или выступать, когда она реализована на Java!

1 голос
/ 27 октября 2009

Меня заставили считать, что если вы можете соединиться с классами А и В между отношениями «А - это В» (кит - млекопитающее), то они связаны наследством.

Так что я предпочитаю ЕСТЬ

...