2016-04-11 46 views
7

Dziś miałem wywiad na stanowisko inżyniera oprogramowania. Czytałem wiele rzeczy od stackoverflow na rozmowę kwalifikacyjną. Pytali mnie o normalne rzeczy, które zostały zrealizowane w OOP. Ale oni także zapytali mnie o te:Czy dziedziczenie jest niezbędne do enkapsulacji, abstrakcji i polimorfizmu?

Czy enkapsulacja jest możliwa bez dziedziczenia?

Czy abstrakcja jest możliwa bez dziedziczenia?

Czy polimorfizm jest możliwy bez dziedziczenia?

Odpowiedziałem na nie zgodnie z moją wiedzą na temat OOP. Nie wiem, czy to dobrze, czy źle. Czy ktoś może mi powiedzieć poprawną odpowiedź z niektórych powiązanych przykładów.

Dzięki

Odpowiedz

3
  • Czy Encapsulation możliwe bez dziedziczenia?

Tak, ponieważ enkapsulacja to możliwość ukrycia właściwości klasy ze świata zewnętrznego za pomocą metod dostępu.

  • Czy abstrakcja jest możliwa bez dziedziczenia?

Cóż, abstrakcja może odnosić się do wielu rzeczy, ale mówimy o OOP: Nie, klasa abstrakcyjna nie może być stosowany bezpośrednio, można instancji tylko dziedziczonych klas.

  • Czy polimorfizm jest możliwy bez dziedziczenia?

Tak, polimorfizm jest konstrukcją pojedynczego interfejsu dla kilku typów obiektów, na przykład pojedynczego wywołania funkcji, które może przyjmować różne klasy lub typy danych jako argumenty. Mogą być dziedziczone lub nie.

+0

Tak, w enkapsulacji. Mówisz, że masz jedną klasę, w której masz wszystkie metody i chcesz to ukryć spoza świata? dobrze? to gdzie jest twoja metoda dostępu? Jeśli jest w tej samej klasie? to nie są odkryte? –

+0

Chciałem ukryć właściwości klasy lub instancji ze świata zewnętrznego, więc budujesz metody (ustawiające, pobierające itp.), Aby uniknąć bezpośredniego dostępu do nich. To jest hermetyzacja. – manolonte

+0

Część "etc" jest niezbędna. Niektórzy ludzie uważają, że hermetyzacja polega tylko na dostarczaniu pobierających i ustawiających, nie zdając sobie sprawy, że faktycznie chodzi o łączenie danych i związanych z nimi zachowań (tj. Metod, które wykorzystują te dane). [http://www.javaworld.com/article/2075271/core-java/encapsulation-is-not-information-hiding.html](http://www.javaworld.com/article/2075271/core-java/ encapsulation-is-not-information-hiding.html) – Piovezan

2

Enkapsulacja jest zdecydowanie możliwa bez dziedziczenia. Enkapsulacja to koncepcja ukrywania danych pochodzących z obiektów zewnętrznych, które nie powinny móc nimi manipulować. Przykładem enkapsulacji będą prywatne pola obiektu w Javie. Następnie można użyć publicznych metod (takich jak pobierające i ustawiające lub inne metody obliczeniowe) do manipulowania danymi tylko w razie potrzeby.

Abstrakcja i polimorfizm są jednak bezpośrednio związane z dziedziczeniem.

Abstrakcja jest po odjęciu szczegółów implementacji obiektu i utworzenia klasy abstrakcyjnej lub interfejsu (mówiąc językiem Java). Będzie to stanowić umowę na to, co każda klasa implementująca lub dziedzicząca będzie musiała uwzględnić w szczegółowym wdrożeniu. Klasa abstrakcyjna będzie miała podpisy metod, ale bez treści; klasa dziedzicząca zaimplementuje ciała.

Polimorfizm to zdolność do implementacji czegoś abstrakcyjnego w różnych formach. Na przykład, jeśli masz klasę abstrakcyjną o nazwie Animal, która zawierała metodę speak(), możesz utworzyć klasę Dog, która dziedziczy po Animal i implementować speak(), aby drukować "woof", podczas gdy klasa Cat() implementowałaby funkcję speak (), aby wydrukować "miau".

Należy pamiętać, że zależy to od rodzaju badanego polimorfizmu.Możesz, jak stwierdzono w innej odpowiedzi, mieć polimorfizm parametrów metody/funkcji, i jak stwierdzono, że jest to możliwe bez dziedziczenia.

0

Cóż, moje rozumienie:

  • Encapsulation jest tylko pomysł, aby zapobiec bezpośredniemu modyfikacji państwa jest instancji, można to zrobić nawet bez OOP.

  • Abstrakcja to uogólnienie klas (szablonów obiektów), nie można wykonać bez dziedziczenia. Koncentruje się na wspólnych warunkach umowy.

  • Polimorfizm oznacza to samo działanie, ale różne zachowania. Zwykle to działa z abstrakcją/interfejsami. To nie może być zrobione bez OOP

+0

bez OOP czy bez dziedziczenia? –

+0

bez dziedziczenia i tak, nawet bez OOP. –

0
  • Encapsulation jest możliwe bez dziedziczenia:

    wystarczy dodać atrybut prywatny do klasy i używać setter i pobierające dostępu do tego atrybutu.

  • Abstraction przez to samo jest możliwe bez dziedziczenia: Można dokonać klasy abstrakcyjne i nie wymaga żadnego spadku.

Jeśli pytanie było zadawane: mogą klasą abstrakcyjną być wykorzystywane bez dziedziczenia?

Wtedy nie, nie można go używać bez dziedziczenia, ponieważ najpierw musi zostać utworzony instancja, a zatem wymaga dziedziczenia. Ale sama abstrakcja nie potrzebuje dziedziczenia.

  • Polymorphism jest niemożliwe bez dziedziczenia: To dlatego, że polimorfizm między dwoma typu obiektów musi mieć coś wspólnego dla działać. Może to być proste nawet przez klasę Object w przypadku java, z której wywodzą się wszystkie klasy.
+0

To zależy całkowicie od języka. Na przykład w Smalltalk można osiągnąć polimorfizm bez dziedziczenia, ponieważ Smalltalk jest późnym językiem wiążącym, który pozwala traktować dwa obiekty tak samo długo, jak długo oba implementują te same metody (w tym podpisy). –

+0

Dobrze wiedzieć. Więc nie ma poprawnej odpowiedzi na to pytanie, dopóki nie zostanie określony język? – Rana

1

Odpowiedź na wszystkie trzy pytania brzmi: tak, można je wykonywać bez dziedziczenia, ale prawdziwa odpowiedź brzmi: "To zależy od języka, w którym są zaimplementowane".

Mam na myśli to, że pierwszy kompilator C++ faktycznie skompilował swój kod do standardowego C, który nie jest językiem OOP. Oczywiście kod musiał zostać skompilowany do języka, który nie wspierał dziedziczenia.

0

Powiedziałbym, że

Enkapsulacja - tak. Na przykład funkcja manipulująca zadeklarowaną w niej zmienną statyczną (jak w C++). Lub kod c ukrywający nie wyeksportowane zmienne i funkcje z innych jednostek kompilacji.

Abstrakcja - tak. "Pojęcia" w C++ są tego przykładem.W języku C++ można napisać procedurę i powiedzieć "ten kod kompiluje się, dopóki typ argumentu definiuje mniej niż operator".

Polimorfizm - tak. Prosty wskaźnik funkcji może być użyty do zapewnienia implementacji wtykowej.