Есть ли техническая разница между подклассом и унаследованным классом? - PullRequest
6 голосов
/ 28 июня 2011

Есть ли техническая разница между классом, который наследуется от другого класса, и классом, который является его подклассом? В чем разница между A и B в следующем коде:

A)

public class foo {
 ...
 private class bar {...}
}

В)

public class foo { ...}

private class bar extends foo {...}

Ответы [ 5 ]

13 голосов
/ 28 июня 2011

Вы смешиваете термины.Подкласс такой же, как унаследованный класс.

В примере A bar является внутренним классом .Внутренний класс похож на вложенный тип.bar может видеть все личные вещи от foo, но это не само по себе foo (вы не можете разыграть bar до foo).

2 голосов
/ 28 июня 2011

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

В случае класса-члена внутренний класс является просто деталью реализации внешнего класса и даже невидим для потребителя.Даже если бы это было видно, это была бы только особенность класса foo.Вы можете видеть, что эти две ситуации семантически сильно различаются, и вам нужно выбрать ту, которая наиболее точно представляет вашу фактическую модель данных.

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

0 голосов
/ 28 июня 2011

В А) строка класса не унаследована от класса foo.

В B) класс является подклассом или унаследованным классом foo. Подкласс и унаследованный класс являются синонимами.

0 голосов
/ 28 июня 2011

В вашем примере A) bar не является "подклассом" - это вложенный класс.

См. Этот вопрос для получения дополнительной информации о том, для чего используются вложенные классы: Зачем мне нужно использовать вложенные классы C #

0 голосов
/ 28 июня 2011

При использовании B) бар тоже foo. Он наследует все переменные и методы-члены от foo. В A) bar имеет доступ только к методам foo, но сам не имеет их. Тогда это не фу.

...