Wykres porównania
Podstawa do porównania | Berło | Klasa abstrakcyjna |
---|---|---|
Podstawowy | Gdy masz wiedzę o wymaganiach, a nie o jej implementacji, użyjesz "Interfejsu". | Kiedy częściowo wiesz o implementacjach użyjesz "klas abstrakcyjnych". |
Metody | Interfejs zawiera tylko abstrakcyjne metody. | Klasa abstrakcyjna zawiera metody abstrakcyjne oraz konkretne metody. |
Dostęp do modyfikatora metod | Metody interfejsu są zawsze "publiczne" i "abstrakcyjne", nawet jeśli nie deklarujemy. Stąd można powiedzieć, że jest to 100% czysta abstrakcyjna klasa. | Nie jest obowiązkowe, aby ta metoda w klasie abstrakcyjnej była jawna i abstrakcyjna. Może również mieć konkretne metody. |
Ograniczony modyfikator dla metod | Metody interfejsu nie można deklarować z następującymi modyfikatorami: Publiczne: prywatne i chronione Streszczenie: końcowe, statyczne, zsynchronizowane, natywne, strictfp. | Nie ma ograniczeń dotyczących modyfikatorów abstrakcyjnej zmiennej klasy. |
Uzyskaj dostęp do modyfikatora zmiennych | Modyfikator dostępu dozwolony dla zmiennych interfejsów są publiczne, statyczne i końcowe, niezależnie od tego, czy deklarujemy czy nie. | Zmienne w klasie abstrakcyjnej nie muszą być publiczne, statyczne, ostateczne. |
Ograniczone modyfikatory zmiennych | Zmienne interfejsu nie mogą być zadeklarowane jako prywatne, chronione, przejściowe, zmienne. | Nie ma ograniczeń co do modyfikatorów abstrakcyjnych zmiennych klasowych. |
Inicjalizacja zmiennych | Zmienne interfejsu muszą zostać zainicjowane w momencie deklaracji. | Nie jest obowiązkowe, aby abstrakcyjne zmienne klasy były inicjalizowane w momencie deklaracji. |
Instancje i statyczne bloki | Wewnątrz interfejsu nie można zadeklarować wystąpienia ani bloku statycznego. | Klasa abstrakcyjna pozwala na instancję lub blok statyczny wewnątrz niej. |
Konstruktorzy | Nie możesz zadeklarować konstruktora w interfejsie. | Możesz zadeklarować konstruktor wewnątrz klasy abstrakcyjnej. |
Definicja interfejsu
Java nie zezwala na wielokrotne dziedziczenie. Oznacza to, że jedna klasa nie może dziedziczyć więcej niż jednej klasy naraz. Przyczynę tego można wyjaśnić na przykładzie. Załóżmy, że mamy dwie klasy nadrzędne, A i B oraz klasę pochodną C. Klasa pochodna C dziedziczy obie klasy A i B. Teraz obie mają klasę A i B mają metodę set (), wtedy będzie to pytanie dla klasy C, która powinna być dziedziczona przez metodę set () klasy. Rozwiązaniem tego problemu jest "interfejs".
access_specifier interface nazwa_interfejsu {return-type nazwa-metody1 (lista parametrów); return-type nazwa-metody2 (lista parametrów); type final-varname1 = value; wpisz final-nazwainna2 = wartość; // ... return-type nazwa-metodyN (lista parametrów); type final-varnameN = wartość; }
Specyfikator dostępu jest jawny, ponieważ klasy muszą implementować interfejs.
Nie mamy pojęcia "Interfejs" w C ++. Ale Java i C # definiują interfejs bardzo dobrze.
Interfejs w Javie:
- Zmienne interfejsu są domyślnie zawsze publiczne, statyczne i ostateczne.
- Zmienne muszą zostać zainicjalizowane w momencie deklaracji.
- Zmiennych nigdy nie można zadeklarować jako prywatnych, chronionych, przejściowych i niestabilnych.
- Metody interfejsu są zawsze publiczne i abstrakcyjne, podczas gdy nigdy nie mogą być zadeklarowane jako prywatne, chronione, ostateczne, statyczne, zsynchronizowane, natywne i strictfp.
- Nie można zadeklarować żadnego konstruktora wewnątrz interfejsu, ponieważ głównym celem konstruktora jest inicjalizacja zmiennych klasowych, ale w zmiennych interfejsów są one inicjalizowane w momencie deklaracji.
- Interfejs może dziedziczyć inne interfejsy, ale klasa implementująca taki interfejs musi implementować metody wszystkich dziedziczonych interfejsów.
- Klasa może dziedziczyć więcej niż jeden interfejs jednocześnie i musi implementować wszystkie metody wszystkich dziedziczonych interfejsów.
Ogólna forma implementacji interfejsu w Javie:
class class_name implementuje Interface_name {// body-body}
W przypadku dziedziczenia interfejsu klasa używa słowa kluczowego "narzędzia", a klasa implementuje całą metodę zadeklarowaną przez odziedziczony interfejs.
Interfejs w języku C #:
Interfejs w języku C # jest prawie podobny do interfejsu w Javie, z wyjątkiem:
- Interfejs w języku C # nie deklaruje zmiennych.
- Nazwa interfejsu jest poprzedzona wielką literą I i jest dziedziczona znakiem dwukropka (:).
Ogólna forma implementacji interfejsu w języku C #:
class nazwa_klasy: nazwa_interfejsu {// klasa-ciało}
Definicja klasy abstrakcyjnej
Klasa zawierająca jedną lub więcej metod abstrakcyjnych nazywana jest klasą abstrakcyjną, a klasa jest deklarowana jako abstrakcyjna za pomocą słowa kluczowego "streszczenie", poprzedzonego słowem kluczowym "klasa" na początku deklaracji klasy. Ponieważ klasa abstrakcyjna zawiera metodę abstrakcyjną, stanowi ona rodzaj niekompletny. Dlatego nie można tworzyć obiektów klasy abstrakcyjnej. Ilekroć klasa dziedziczy klasę abstrakcyjną, musi implementować wszystkie abstrakcyjne metody klasy abstrakcyjnej, jeśli tak nie jest, musi również zostać zadeklarowana jako abstrakcyjna. Cecha abstrakcyjna jest dziedziczona aż do osiągnięcia pełnej realizacji metod abstrakcyjnych.
Klasa abstrakcyjna może również zawierać konkretne metody, które mogą być wykorzystywane przez klasę pochodną taką, jaka jest. Ale nie możesz zadeklarować abstrakcyjnego konstruktora lub abstrakcyjnej metody statycznej wewnątrz klasy abstrakcyjnej. Ogólna forma klasy abstrakcyjnej w Javie jest następująca:
abstract class class_name {abstract nazwa_metody1 (); abstract nazwa_metody2 (); : return_type nazwa_metody3 (lista_parametrów) {// metoda konkretna} return_type nazwa_metody4 (lista_parametrów) {// metoda konkretna}};
Pojęcie klasy abstrakcyjnej jest podobne zarówno w Javie, jak iw języku C #. Klasa abstrakcyjna jest nieco inna w C ++.
W C ++, jeśli klasa ma co najmniej jedną funkcję wirtualną, klasa staje się klasą abstrakcyjną. Zamiast słowa kluczowego "streszczenie" słowo kluczowe "wirtualny" służy do zadeklarowania metody abstrakcyjnej.
Kluczowe różnice między interfejsem a klasą abstrakcyjną w języku Java i C #
- Kiedy masz wiedzę o tym, "co jest wymagane", ale nie o tym, "w jaki sposób zostanie ona wdrożona", należy użyć interfejsu. Z drugiej strony, jeśli wiesz, co jest wymagane i częściowo wiesz, jak zostałoby to zaimplementowane, użyj klasy abstrakcyjnej.
- Interfejs ma wszystkie metody abstrakcyjne, ale klasa abstrakcyjna ma kilka metod abstrakcyjnych i kilka konkretnych metod.
- Metody wewnątrz interfejsu są publiczne i abstrakcyjne, stąd też nazywa się je czystą klasą abstrakcyjną. Z drugiej strony, metody zawarte w streszczeniu nie ograniczają się jedynie do jawności i abstrakcji.
- Metoda interfejsu nigdy nie może być prywatna, chroniona, ostateczna, statyczna, zsynchronizowana, natywna lub strictfp. Z drugiej strony nie ma żadnych ograniczeń co do metod klasy abstrakcyjnej.
- Zmienne w interfejsie są publiczne i ostateczne, niezależnie od tego, czy je zadeklarujemy, czy też nie, podczas gdy nie ma takiego ograniczenia w odniesieniu do zmiennych klasy abstrakcyjnej, które mają być tylko publiczne i ostateczne.
- Zmienne w interfejsie nigdy nie mogą być chronione prywatnie jako przejściowe lub niestabilne, podczas gdy nie ma ograniczeń dla zmiennych w klasie abstrakcyjnej.
- Zmienna interfejsu musi być zainicjalizowana podczas deklaracji. Z drugiej strony zmienne w klasie abstrakcyjnej można zainicjować w dowolnym momencie.
- Wewnątrz interfejsu instancji lub bloku statycznego nie można zadeklarować, ale można zadeklarować instancję lub blok statyczny wewnątrz klasy abstrakcyjnej.
- Nie można zdefiniować konstruktora wewnątrz interfejsu, podczas gdy można zdefiniować konstruktor wewnątrz klasy abstrakcyjnej.
Wniosek:
Kiedy trzeba utworzyć klasę podstawową, która zawiera uogólnioną formę metod, które mogą być implementowane przez klasy pochodne zgodnie z ich potrzebami, pomaga koncepcja interfejsu i klasy abstrakcyjnej.