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

Autor: Laura McKinney
Data Utworzenia: 1 Kwiecień 2021
Data Aktualizacji: 17 Móc 2024
Anonim
Różnica między interfejsem a klasą abstrakcyjną w Javie i C # - Technologia
Różnica między interfejsem a klasą abstrakcyjną w Javie i C # - Technologia

Zawartość


Zarówno klasa interfejsu, jak i klasa abstrakcyjna przyczyniają się do „niekompletnego typu” w OOP. Czasami potrzebujemy superklasy, aby zdefiniować „co robić”, ale nie „jak to zrobić”, to jak zrobić część zostanie zaimplementowana przez klasę pochodną zgodnie z jej potrzebą, „berło”Zapewniają rozwiązanie tego problemu. Czasami potrzebujemy klasy nadklasy, 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 problemu. Podstawowa różnica między interfejsem a klasą abstrakcyjną polega na tym, że interfejs jest całkowicie niekompletny, a klasa abstrakcyjna jest częściowo niekompletna.

  1. Wykres porównania
  2. Definicja
  3. Kluczowe różnice
  4. Wniosek

Wykres porównania

Podstawa do porównaniaBerłoKlasa abstrakcyjna
PodstawowyJeśli masz wiedzę na temat wymagań, a nie jego implementacji, używasz „Interfejsu”.Gdy częściowo wiesz o implementacjach, używasz „klas abstrakcyjnych”.
MetodyInterfejs zawiera tylko metody abstrakcyjne.Klasa abstrakcyjna zawiera zarówno metody abstrakcyjne, jak i konkretne.
Uzyskaj dostęp do modyfikatora metodMetody interfejsu są zawsze „publiczne” i „abstrakcyjne”, nawet jeśli nie deklarujemy. Dlatego można powiedzieć, że jest to 100% czysta klasa abstrakcyjna.Nie jest obowiązkowe, aby metoda w klasie abstrakcyjnej była publiczna i abstrakcyjna. Może mieć również konkretne metody.
Ograniczony modyfikator metodNie można zadeklarować metody interfejsu za pomocą następujących modyfikatorów:
Publiczny: prywatny i chroniony
Streszczenie: końcowy, statyczny, zsynchronizowany, natywny, strictfp.
Nie ma ograniczeń dotyczących modyfikatorów zmiennej klasy abstrakcyjnej.
Dostęp do modyfikatora zmiennychModyfikator dostępu dozwolony dla zmiennych interfejsu jest publiczny, statyczny i końcowy, niezależnie od tego, czy deklarujemy, czy nie.Zmienne w klasie abstrakcyjnej nie muszą być publiczne, statyczne, końcowe.
Ograniczone modyfikatory dla zmiennychZmiennych interfejsu nie można zadeklarować jako prywatne, chronione, przejściowe, zmienne.Nie ma ograniczeń dotyczących modyfikatorów abstrakcyjnych zmiennych klas.
Inicjalizacja zmiennychZmienne interfejsu należy zainicjować w momencie deklaracji.Nie jest obowiązkowe, aby abstrakcyjne zmienne klasowe były inicjalizowane w momencie deklaracji.
Instancje i bloki statyczneWewnątrz interfejsu nie można zadeklarować wystąpienia ani bloku statycznego.Klasa abstrakcyjna pozwala na wystąpienie w niej instancji lub bloku statycznego.
KonstruktoryNie można zadeklarować konstruktora w interfejsie.Możesz zadeklarować konstruktor w klasie abstrakcyjnej.


Definicja interfejsu

Java nie zezwala na wielokrotne dziedziczenie. Oznacza to, że pojedyncza klasa nie może dziedziczyć więcej niż jednej klasy na raz. Przyczynę tego można wyjaśnić przykładem. Załóżmy, że mamy dwie klasy nadrzędne, A i B oraz pochodną klasę C. Pochodna klasa C dziedziczy obie klasy A i B.Teraz oba mają klasy A i B mają metodę set (), wtedy dla klasy C będzie pytanie, którą metodę set () klasy powinien odziedziczyć. Rozwiązaniem tego problemu jest „interfejs”.

Interfejs jest czysto abstrakcyjną klasą. Słowo kluczowe użyte do stworzenia interfejsu to „interfejs”. Ponieważ wszystkie metody w interfejsie są w pełni abstrakcyjne. Interfejs określa tylko, co klasa musi zrobić, ale nie określa, w jaki sposób to robi. Tylko dlatego, że wszystkie metody zadeklarowane w interfejsie są abstrakcyjne, żadna instancja nie jest tworzona dla interfejsu. Ogólna forma „interfejsu” w java to:


access_specifier berło nazwa_interfejsu {return-type nazwa-metody1 (lista parametrów); return-type nazwa-metody2 (lista parametrów); typ final-varname1 = wartość; typ final-varname2 = wartość; // ... return-type nazwa-metodyN (lista parametrów); wpisz final-varnameN = wartość; }

Specyfikator dostępu jest zadeklarowany jako publiczny, ponieważ klasy muszą implementować interfejs.

W C ++ nie mamy pojęcia „Interfejs”. Ale Java i C # bardzo dobrze definiują interfejs.

Interfejs w Javie:

  • Zmienne interfejsu są domyślnie zawsze publiczne, statyczne i końcowe.
  • Zmienne należy zainicjować w momencie deklaracji.
  • Zmiennych nigdy nie można zadeklarować jako prywatne, chronione, przejściowe i zmienne.
  • Metody interfejsu są zawsze publiczne i abstrakcyjne, ale nigdy nie mogą być zadeklarowane jako prywatne, chronione, końcowe, statyczne, zsynchronizowane, rodzime i strictfp.
  • Nie można zadeklarować żadnego konstruktora w interfejsie, ponieważ głównym celem konstruktora jest inicjalizacja zmiennych klas, ale w interfejsie zmienne są inicjalizowane w momencie deklaracji.
  • Interfejs może dziedziczyć inne interfejsy, ale klasa implementująca taki interfejs musi implementować metody wszystkich odziedziczonych interfejsów.
  • Klasa może dziedziczyć więcej niż jeden interfejs na raz i musi implementować wszystkie metody wszystkich odziedziczonych interfejsów.

Ogólna forma implementacji interfejsu w Javie:

klasa nazwa_klasy implementuje nazwę_interfejsu {// klasa-ciało}

Do dziedziczenia interfejsu klasa używa słowa kluczowego „implementuje”, a klasa implementuje całą metodę zadeklarowaną przez interfejs dziedziczony.

Interfejs w C #:

Interfejs w 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 C #:

klasa nazwa_klasy: nazwa_interakcji {// 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 niekompletny typ. Dlatego nie można tworzyć obiektów klasy abstrakcyjnej. Ilekroć klasa dziedziczy klasę abstrakcyjną, musi zaimplementować wszystkie metody abstrakcyjne klasy abstrakcyjnej, jeśli tak nie jest, należy ją również zadeklarować jako abstrakcyjną. Atrybut abstrakcyjny jest dziedziczony do momentu pełnego wdrożenia metod abstrakcyjnych.

Klasa abstrakcyjna może również zawierać konkretne metody, które mogą być wykorzystane przez klasę pochodną w jej obecnym kształcie. Nie można jednak zadeklarować abstrakcyjnego konstruktora ani abstrakcyjnej metody statycznej w klasie abstrakcyjnej. Ogólna forma klasy abstrakcyjnej w Javie jest następująca:

klasa abstrakcyjna nazwa_klasy {abstrakcja nazwa_metody1 (); streszczenie method_name2 (); : return_type method_name3 (lista_parametrów) {// konkretna metoda} return_type nazwa_metodowa4 (lista_parametrów) {// konkretna metoda}};

Pojęcie klasy abstrakcyjnej jest podobne zarówno w Javie, jak i 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 deklarowania metody abstrakcyjnej.

  1. Jeśli masz wiedzę na temat „tego, co jest wymagane”, ale nie na temat „w jaki sposób zostanie to zaimplementowane”, należy użyć interfejsu. Z drugiej strony, jeśli wiesz, co jest wymagane i częściowo wiesz, w jaki sposób zostanie to zaimplementowane, użyj klasy abstrakcyjnej.
  2. Interfejs ma wszystkie swoje metody abstrakcyjne, ale klasa abstrakcyjna ma pewne metody abstrakcyjne i niektóre konkretne metody.
  3. Metody wewnątrz interfejsu są publiczne i abstrakcyjne, dlatego nazywane są również klasą czysto abstrakcyjną. Z drugiej strony metody wewnątrz abstraktu nie są ograniczone do publicznego i abstrakcyjnego.
  4. Metoda interfejsu nigdy nie może być prywatna, chroniona, końcowa, statyczna, zsynchronizowana, natywna ani strictfp. Z drugiej strony nie ma ograniczeń metod klasy abstrakcyjnej.
  5. Zmienne w interfejsie są publiczne i końcowe, bez względu na to, czy je zadeklarujemy, czy też nie, podczas gdy nie ma takiego ograniczenia do zmiennych klasy abstrakcyjnej, które mają być publiczne i końcowe.
  6. Zmienne w interfejsie nigdy nie mogą być chronione prywatnie jako przejściowe lub zmienne, podczas gdy nie ma ograniczeń dla zmiennych w klasie abstrakcyjnej.
  7. Zmienna interfejsu musi zostać zainicjowana podczas deklaracji. Z drugiej strony zmienne w klasie abstrakcyjnej można zainicjować w dowolnym momencie.
  8. W interfejsie nie można zadeklarować wystąpienia ani bloku statycznego, ale można zadeklarować wystąpienie lub blok statyczny w klasie abstrakcyjnej.
  9. Nie można zdefiniować konstruktora w interfejsie, natomiast można zdefiniować konstruktor w klasie abstrakcyjnej.

Wniosek:

Gdy trzeba utworzyć klasę podstawową, która zawiera uogólnioną formę metod, które mogą być zaimplementowane przez klasy pochodne zgodnie z ich potrzebami, pomaga w tym koncepcja interfejsu i klasa abstrakcyjna.