Необходимо ли наследование для инкапсуляции, абстракции и полиморфизма?
сегодня у меня было интервью на должность инженера программного обеспечения. Я прочитал много вещей из 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".
полиморфизм - да. Простой указатель функции может использоваться для осуществления замены.