jest to prawdopodobnie najczęściej zadawane pytanie w wywiadach dotyczących tworzenia oprogramowania lub zapewniania jakości oprogramowania. Z mojego doświadczenia wynika, że często wielu z nas jest zdezorientowanych lub zapomina o definicji i wykorzystaniu abstrakcyjnych klas i interfejsów. Chcę, żeby było jak najłatwiej, żeby nikt już nie miał z tym problemów.
klasa abstrakcyjna i interfejsy to dwa bardzo ważne punkty w koncepcji programowania obiektowego.,
na początku wyjaśnię klasę abstrakcyjną i jej użycie, a później przejdziemy do interfejsów.
klasa abstrakcyjna nie jest niczym szczególnym, jeśli chcesz odróżnić ją od zwykłej klasy. Ale ma pewne metody, które nie są wdrożone, lub tylko zadeklarowane, nie zdefiniowane. W takim przypadku wszystkie te metody i sama klasa zostaną nazwane słowem kluczowym „abstract”.
klasa abstrakcyjna może mieć jedną lub wiele liczb nie zaimplementowanych metod.,
ponieważ klasa abstrakcyjna nie jest właściwa lub nie ma idealnie zdefiniowanych metod w porównaniu do klasy zwykłej, więc klasy abstrakcyjne nie mogą być tworzone jako instancje, co oznacza, że nie możemy tworzyć żadnych bezpośrednich obiektów klas abstrakcyjnych.
klasy, które dziedziczą/rozszerzają tę klasę abstrakcyjną, muszą zaimplementować / zdefiniować wszystkie metody abstrakcyjne nadrzędnej klasy abstrakcyjnej.
Jeśli jakakolwiek klasa nie zdefiniuje żadnej z metod abstrakcyjnych, ta klasa również staje się klasą abstrakcyjną.,
zastosowanie (wyimaginowane studium przypadku):
Załóżmy, że w 1995 roku zaprojektowałeś klasę samochodu, która miała dodatkową funkcję-mogła latać. Bardzo ładnie zaprojektowałeś klasę samochodów, wszystkie Twoje metody były bardzo standardowe i wydajne, ale wtedy wiedziałeś, że wdrożenie metody carFlying () jest całkiem niemożliwe. Tak więc, po prostu trzymałeś metodę carFlying() pustą lub niewprowadzoną (teraz wiesz, że jest to metoda abstrakcyjna, a także Klasa!).,
dzisiaj chcę wdrożyć ten latający samochód, który już zaprojektowałeś, a technologia nie jest już niemożliwa. Samochód, który zbuduję ma Wszystkie cechy podobne do twojego samochodu, a dodatkowo może latać. Więc, co mogę zrobić, to mogę po prostu dziedziczyć („extends” – dla Javy) Twoją abstrakcyjną klasę i muszę zdefiniować/zaimplementować tę metodę carFlying() abstract. proszę bardzo! nasz latający samochód jest gotowy do jazdy.
tak więc, za każdym razem, gdy mamy jakieś wspólne cechy lub zachowanie między różnymi obiektami, możemy utworzyć ogólną klasę abstrakcyjną z tą cechą jako zaimplementowaną metodą., Ale te obiekty mogą mieć różne zachowania, w takim przypadku zadeklarujemy abstrakcyjną metodę i zaimplementujemy te abstrakcyjne metody inaczej w zależności od potrzeb obiektu.
przykład klasy abstrakcyjnej:
Po raz kolejny rozważmy przykład, Banda zapaśników dostaje taką samą ilość pieniędzy za godzinę gry. ale mają inną muzykę tematyczną i kończącą strategię walki. Możemy więc zachować metodę płatności dla wszystkich i zaimplementować ją w klasie o nazwie Wrestler., zadeklarujmy metody themeMusic() i finisher() jako abstrakcyjne, ponieważ te dwie muszą być zaimplementowane inaczej dla różnych obiektów w innych klasach, które dziedziczą naszą abstrakcyjną klasę Wrestler.
i głównym.java:
Interface:
jeśli poprawnie przeszedłeś przez górną część tego samouczka, zrozumienie interfejsu będzie dla ciebie bardzo łatwiejsze.
interfejs nie jest klasą, tylko interfejsem. Ma kilka metod bez ciała w środku, tylko podpis metody (są to w zasadzie metody abstrakcyjne!,) i mogą mieć pewne zmienne końcowe i statyczne. I, typowa klasa „implementuje” interfejsy, a nie „rozszerza”.
można zaimplementować wiele interfejsów (zazwyczaj dziedziczonych) naraz.
klasy, które dziedziczą / implementują interfejsy, muszą definiować wszystkie abstrakcyjne metody interfejsu.
metody wewnątrz interfejsów są domyślnie public, void i abstract.
interfejs jest rodzajem dziedziczenia Wielokrotnego w języku programowania Java.
nie możemy tworzyć instancji interfejsów tak jak abstrakcyjne klasy., Ponieważ są one niekompletne i nie powinny być dozwolone do realizacji. Ale czasami taka aktywność, jak tworzenie instancji, może być dla niej stosowana za pomocą anonimowej klasy wewnętrznej. To nie jest nasz dzisiejszy Plan.
zastosowanie interfejsu:
Interfejsy oszczędzają czas kodowania. Może zawierać pewne zmienne statyczne i końcowe, które mogą być dostępne globalnie. i niektóre metody, które są abstrakcyjne i łatwo dostępne do dalszego wykorzystania w dowolnym momencie dla tego, kto implementuje interfejs.,
przykład interfejsu:
w powyższym przykładzie klasy abstrakcyjnej widzieliśmy, że jedna metoda jest taka sama dla wszystkich, którzy mieli ciało wewnątrz klasy abstrakcyjnej, a inne metody były abstrakcyjne. ale w przypadku interfejsów wszystkie metody są teraz tylko podpisem. Klasa StoneCold implementuje interfejs wrestlera i definiuje wszystkie trzy abstrakcyjne metody w zależności od potrzeb.
tym razem różni wrestlerzy dostają różną ilość pieniędzy na godzinę. Tak więc najwygodniej jest umieścić tę samą metodę jako abstrakcję i zdefiniować ją gdzie indziej zgodnie z potrzebami obiektu.,
public interface Wrestler {
public abstract void paymentForWork (int hours);
public abstract void themeMusic();
public abstract void finisher();
}
i następująca klasa implementuje interfejs wrestlera.
dla głównej.java:
dla obiektu inicjującego w przypadku klasy abstrakcyjnej lub interfejsu, możesz mieć na uwadze następujące elementy:
A obj= new B();
//where A is an interface/abstract class. B is the concrete(implements/extends "A”)class which gives it’s memory to A’s obj to have access into B class and utilize its defined methods.