Zalecane, 2019

Wybór Redakcji

Różnica między interfejsem a klasą abstrakcyjną w języku Java i C #

Klasa interfejsu i abstrakcyjna przyczyniają się do "niepełnego typu" w OOP. Czasami potrzebujemy superklasy, aby zdefiniować "co robić", ale nie "jak to zrobić", tak jak to zrobić, część zostanie zaimplementowana przez klasę pochodną zgodnie z jej potrzebą, " interfejs " zapewnia rozwiązanie tego. Czasami potrzebujemy klasy superklasy, która definiuje jakąś uogólnioną strukturę, która może być zaimplementowana przez klasy pochodne i pewną określoną strukturę, która może być wykorzystana przez klasy pochodne, " klasa abstrakcyjna " zapewnia rozwiązanie tego. Podstawową różnicą między interfejsem a klasą abstrakcyjną jest to, że interfejs jest w pełni niekompletny, a klasa abstrakcyjna jest częściowo niekompletna.

Wykres porównania

Podstawa do porównaniaBerłoKlasa abstrakcyjna
PodstawowyGdy masz wiedzę o wymaganiach, a nie o jej implementacji, użyjesz "Interfejsu".Kiedy częściowo wiesz o implementacjach użyjesz "klas abstrakcyjnych".
MetodyInterfejs zawiera tylko abstrakcyjne metody.Klasa abstrakcyjna zawiera metody abstrakcyjne oraz konkretne metody.
Dostęp do modyfikatora metodMetody 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 metodMetody 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 zmiennychModyfikator 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 zmiennychZmienne interfejsu nie mogą być zadeklarowane jako prywatne, chronione, przejściowe, zmienne.Nie ma ograniczeń co do modyfikatorów abstrakcyjnych zmiennych klasowych.
Inicjalizacja zmiennychZmienne interfejsu muszą zostać zainicjowane w momencie deklaracji.Nie jest obowiązkowe, aby abstrakcyjne zmienne klasy były inicjalizowane w momencie deklaracji.
Instancje i statyczne blokiWewnątrz interfejsu nie można zadeklarować wystąpienia ani bloku statycznego.Klasa abstrakcyjna pozwala na instancję lub blok statyczny wewnątrz niej.
KonstruktorzyNie 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".

Interfejs to czysta abstrakcyjna klasa. Słowo kluczowe użyte do stworzenia interfejsu to "interfejs". Ponieważ wszystkie metody wewnątrz interfejsu są w pełni abstrakcyjne. Interfejs określa tylko to, co klasa musi zrobić, ale nie definiuje, jak to robi. Tylko dlatego, że cała metoda zadeklarowana w interfejsie jest abstrakcyjna, dla interfejsu nie jest tworzone żadne wystąpienie. Ogólna forma "interfejsu" w języku Java to:

 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 #

  1. 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.
  2. Interfejs ma wszystkie metody abstrakcyjne, ale klasa abstrakcyjna ma kilka metod abstrakcyjnych i kilka konkretnych metod.
  3. 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.
  4. 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.
  5. 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.
  6. Zmienne w interfejsie nigdy nie mogą być chronione prywatnie jako przejściowe lub niestabilne, podczas gdy nie ma ograniczeń dla zmiennych w klasie abstrakcyjnej.
  7. Zmienna interfejsu musi być zainicjalizowana podczas deklaracji. Z drugiej strony zmienne w klasie abstrakcyjnej można zainicjować w dowolnym momencie.
  8. Wewnątrz interfejsu instancji lub bloku statycznego nie można zadeklarować, ale można zadeklarować instancję lub blok statyczny wewnątrz klasy abstrakcyjnej.
  9. 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.

Top