Необходимо ли наследование для инкапсуляции, абстракции и полиморфизма?

сегодня у меня было интервью на должность инженера программного обеспечения. Я прочитал много вещей из stackoverflow для интервью. Они спросили меня о том, что нормально для опа. Но они также спросили меня об этом:

возможна ли инкапсуляция без наследования?

возможна ли Абстракция без наследования?

возможен ли полиморфизм без наследования?

Я ответил на них в соответствии с моим знанием ООП. Я не знайте, правильно это или неправильно. Может ли кто-нибудь сказать мне правильный ответ на них с некоторыми связанными примерами.

спасибо

6 ответов


  • возможна ли инкапсуляция без наследования?

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

  • возможна ли Абстракция без наследования?

ну, абстракция может относиться ко многим вещам, но говорить об ООП: Нет, абстрактный класс нельзя использовать напрямую, можно только создавать экземпляры унаследованных классов.

  • Is Полиморфизм возможен без наследования?

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


инкапсуляция определенно возможна без наследования. Инкапсуляция-это концепция сокрытия данных от внешних объектов, которые не должны иметь возможности манипулировать ими. Примером инкапсуляции могут быть частные поля объекта в Java. Затем можно использовать общедоступные методы (например, геттеры и сеттеры или другие методы вычисления) для управления данными только по мере необходимости.

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

абстракция-это когда вы забираете детали реализации объекта и создаете абстрактный класс или интерфейс (говоря с точки зрения Java). Это будет действовать как контракт для того, что любой реализующий или наследующий класс должен будет включить в подробную реализацию. Абстрактный класс будет иметь сигнатуры методов, но не тело; наследующий класс будет реализовывать тела.

полиморфизм-это возможность реализовать что-то абстрактное в разных формах. Например, если у вас есть абстрактный класс Animal, содержащий метод speak (), вы можете создать класс Dog, который наследуется от Animal и реализует speak() для печати "woof", в то время как класс Cat() будет реализовывать speak () для печати "meow".

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


ответ на все три вопроса-да, их можно сделать без наследования, но реальный ответ: "это зависит от языка, на котором они реализованы".

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


Ну, в моем понимании:

  • инкапсуляция-это просто идея, чтобы предотвратить прямое изменение состояние экземпляра, это можно сделать даже без ООП.

  • абстракция-это обобщение классов (шаблонов объектов), она не может обойдемся без наследства. Он фокусируется на общих контрактных условиях.

  • полиморфизм означает одно и то же действие, но разное поведение. Обычно это работает с абстракцией / интерфейсами. Она не может обойдемся без ОП


  • Encapsulation is возможно без наследства:

    просто добавьте частный атрибут в класс и используйте setter и getters для доступа к этому атрибуту.

  • Abstraction им self is возможно без наследства: Вы можете сделать класс абстрактным, и он не требует наследования.

если бы заданный вопрос был:можно ли использовать абстрактный класс без наследство?

тогда нет, он не может использоваться без наследования, потому что он должен быть создан сначала, и поэтому он требует наследования. Но абстракция сама по себе не нуждается в наследстве.

  • Polymorphism и невозможно без наследования: это потому, что полиморфизм между двумя типами объектов должен иметь что-то общее для его работы. Это может быть просто даже Object класс в случае java, из которого все классы являются производными.

Я бы сказал

инкапсуляция - да. Например, функция, управляющая статической переменной, объявленной внутри нее (как в c++). Или код c, скрывающий неэкспортированные переменные и функции из других блоков компиляции.

абстракции - да. Примером этого являются" концепции " на c++. В c++ вы можете написать процедуру и сказать: "этот код компилируется, пока тип аргумента определяет оператор less than".

полиморфизм - да. Простой указатель функции может использоваться для осуществления замены.