Какой концепцией ОО является "Base b = new Derived ()" примером? - PullRequest
10 голосов
/ 22 апреля 2009

Я проходил тест и встретил вопрос, в котором мы не нашли соглашения с моими коллегами.

С ++

  1 class Base {};
  2 class Derived : public Base {};
  3 class Foo
  4 {
  5 public:
  6     Foo()
  7     {
 -8-         Base* b = new Derived(); // Concept name is?
  9     }
 10 };

C #

  1 abstract class Base{}
  2 public class Derived : Base{}
  3
  4 public class Foo
  5 {
  6    public Foo
  7    {
 -8-        Base b = new Derived(); // Concept name is?
  9    }
 10 }

Вопрос в том, что строка № 8, приведенная выше, является примером следующей концепции oo

  1. Полиморфизм
  2. Aggregation
  3. Инкапсуляция
  4. Абстракция
  5. Наследование

Пожалуйста, поставьте ссылку с ответом на источник знаний.

P.S. Тест называется «OO Concept» на брейнбенче. Это бесплатно.

Обновление:

От одного ответа, который защищает полиморфизм

"Проще говоря, полиморфизм - это способность одного типа, А, появляться как и использоваться как другой тип, Б. строго типизированные языки, это обычно означает, что тип А каким-то образом происходит от тип B или тип A реализует интерфейс, представляющий тип B. "

Из википедии, которая защищает наследство

Наследование также иногда называют обобщение, потому что is-a отношения представляют собой иерархию между классами объектов.

и

Следовательно, наследование имеет другое взгляд, двойственный, называется полиморфизмом, который описывает много кусков кода контролируется общим контролем Код.

поэтому Base = new Derived() показывает 'is a' ( наследование ). И следствием этого является полиморфизм .

Так что я сомневаюсь, что правильно?

Ответы [ 10 ]

30 голосов
/ 23 апреля 2009

Этот вопрос прост ... Это Полиморфизм .

Полиморфное поведение достигается благодаря наследованию. Вы можете рассматривать экземпляр Derived как Base, поскольку Derived наследуется от Base. Это определение полиморфизма применительно к типам в ОО-языке ...

http://en.wikipedia.org/wiki/Polymorphism_(computer_science)

[Обновить, Обновить]

Надеюсь, это достаточно определенно ... это разные способы сказать одно и то же.

Полиморфизм (Руководство по программированию в C #)

"Через наследование класс может быть используется как более одного типа; может быть используется как собственный тип, любые базовые типы, или любой тип интерфейса, если он реализует интерфейсы. Это называется полиморфизм. "

[Update]

Учитывая комментарии, я постараюсь быть более конкретным ... Я не говорю, что поскольку Derived наследует от Base, что строка является примером полиморфного поведения, я говорю, что присвоение экземпляра переменной Тип, из которого он происходит, является примером полиморфного поведения. Процитирую первое предложение ссылки, которую я прикрепил ...

"В информатике полиморфизм особенность языка программирования, позволяет значения различных типов данных быть обработанным, используя униформу Интерфейс "

То, что я могу рассматривать экземпляр Derived как экземпляр Base, демонстрирует полиморфное поведение. Это не зависит от наличия виртуальных методов в классе, чтобы быть правдой.

и другая цитата из другого источника ...

"Проще говоря, полиморфизм - это способность одного типа, А, появляться как и использоваться как другой тип, Б. строго типизированные языки, это обычно означает, что тип А каким-то образом происходит от тип B или тип A реализует интерфейс, представляющий тип B. "

14 голосов
/ 23 апреля 2009

Реальный ответ: плохо сформированный и потому бессмысленный вопрос.

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

7 голосов
/ 23 апреля 2009

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

Если вы приставите пистолет к моей голове, я бы, вероятно, выбрал наследование , так как это моделирует, так как Derived наследует Base, тогда Derived может использоваться там, где требуется Base (например, указанная база *) но я мог бы представить защиту любого из ответов.

Если бы я принимал решение о найме, мне было бы больше интересно услышать, как кандидат защитил свой выбранный ответ, чем какой он выбрал. Но компания, использующая такой тест, вероятно, не является таковой или не имеет сотрудников, способных оценить навыки на этом уровне.

7 голосов
/ 22 апреля 2009

Этот фрагмент составляет около Наследование

Грубая сводка понятий

Абстракция - это сама идея моделирования концепции реального мира в терминах объектов, а не размышления о вызовах функций или других вещах. Это в основном думать об объектах как об отдельных объектах.

Инкапсуляция - это сокрытие реализации объекта от внешнего мира за четко определенными интерфейсами.

Наследование - это связь между производными классами и базовыми классами и категоризация понятий. Он определяет отношения "is-a" между сущностями, добавляя возможность использования производных классов там, где ожидается база.

Полиморфизм означает, что два объекта похожи по интерфейсу, но ведут себя по-разному (подумайте о virtual методах).

Агрегация определяет отношение "есть" между двумя понятиями. Означает, что объект состоит из другой сущности.

5 голосов
/ 23 апреля 2009

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

Наследование больше связано с наследованием членов и / или реализаций членов от родительского к дочернему (от базового до производного, от супер к подчиненному, от абстрактного до конкретного) класса.

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

4 голосов
/ 23 апреля 2009

Ответ - полиморфизм.

См. http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming.

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

Определение полиморфизма в простейших терминах подытожено в статье в википедии:

Проще говоря, полиморфизм - это способность одного типа, А, появляться как и использоваться как другой тип, Б. строго типизированные языки, это обычно означает, что тип А каким-то образом происходит от тип B или тип A реализует интерфейс, который представляет тип B.

Конечно, строка 8 является примером объекта , который выглядит как типа Base, но действительно имеет тип Derived

3 голосов
/ 23 апреля 2009
6. None of the above.  

Это пример ковариации.
http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)
См. Также принцип субтитабильности Лискова:
http://en.wikipedia.org/wiki/Liskov_substitution_principle

3 голосов
/ 22 апреля 2009
  1. Полиморфизм

    • нет, потому что мы не делаем никаких вызовов виртуальных методов - и не используем полиморфное поведение любым другим способом
  2. Aggregation

    • нет, потому что Base * b не является членом
  3. Инкапсуляция

    • не вижу того, что мы инкапсулировали .. кроме реализации конструктора
  4. Абстракция

    • Я думаю - да - мы будем использовать более абстрактный класс, чем созданный
  5. Наследование

    • Отношение между основанием и производным является наследованием - но вы спросили о строке назначения

EDIT

Абстракция упрощает комплекс реальность путем моделирования классов соответствует проблеме, и работает на наиболее подходящем уровне наследования для данного аспекта эта проблема.

определение из википедии - http://en.wikipedia.org/wiki/Object_oriented

2 голосов
/ 23 апреля 2009

Я думаю, что простой код здесь лучше всего описать как пример подтипа (http://en.wikipedia.org/wiki/Subtype). В терминологии объектно-ориентированного программирования полиморфизм относится к способности подклассов изменить или специализировать поведение, определенное в базовом классе (http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming).. Этот пример на самом деле не показывает этого.

Из вариантов, перечисленных на мозговом стенде, я думаю, наследование имеет смысл только потому, что оно наиболее расплывчато.

0 голосов
/ 23 апреля 2009

Это не какой-либо из предложенных вариантов.

Речь идет не о полиморфизме, потому что код не вызывает виртуальный метод через базовый указатель или удаляет указатель на базовый класс.

Речь идет не о наследовании, потому что выделенный код не наследует. Линия 2 о наследовании.

Это, конечно, не абстракция, не инкапсуляция и не агрегация, потому что, ну, это совсем не так.

Самая прямая иллюстрация концепции - это автоматическое приведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...