Czym różni się klasa abstrakcyjna od klasy konkretnej?

Rozumiem, dlaczego potrzebujemy klasy abstrakcyjnej w Javie-do tworzenia podklas. Ale to samo można osiągnąć przez konkretną klasę. np. Klasa dziecko rozszerza rodzica. Tutaj rodzic może być abstrakcyjny i konkretny. Dlaczego więc mamy abstrakcję??

Author: Ashish K Agarwal, 2012-04-18

6 answers

Klasy abstrakcyjne nie mogą być bezpośrednio tworzone. Deklarowanie klasy jako abstrakcyjnej oznacza, że nie chcesz jej tworzyć instancji i że klasa może być tylko dziedziczona. Narzucasz regułę w swoim kodzie.

Jeśli rozszerzysz swój przykład relacji rodzic/dziecko o klasę Person, to dobrze by było, gdyby osoba była abstrakcyjna. Rodzic to konkretna idea, podobnie jak dziecko. Osoba jest pojęciem abstrakcyjnym zarówno w rzeczywistości, jak i w kodzie.

One benefit jest to, że jawnie definiujesz i chronisz ideę klasy abstrakcyjnej. Kiedy deklarujesz klasę jako abstrakcję, nie ma możliwości, aby Ty lub ktokolwiek inny korzystający z twojego kodu używał jej nieprawidłowo, tworząc jej instancję. To rozumowanie jest podobne do tego, dlaczego określamy funkcje i pola jako publiczne, prywatne lub chronione. Jeśli zadeklarujesz funkcję lub Członka jako prywatnego, w efekcie chronisz go przed niewłaściwym dostępem z kodu klienta. Szeregowcy są przeznaczeni do użycia w klasie i to wszystko. Klasy abstrakcyjne mają być dziedziczone i tyle.

Teraz, czy musisz używać klas abstrakcyjnych {[10] } i definiować funkcje i pola jako prywatne zamiast publicznych? Nie, Nie wiesz . Ale te koncepcje są dostarczane, aby pomóc utrzymać kod czysty i dobrze zorganizowany. Klasa abstrakcyjna jest zaimplementowana we wszystkich językach zorientowanych obiektowo według mojej wiedzy. Jak się rozejrzysz to zobaczysz że C++, C#, VB.NET itd. wszyscy używają tej koncepcji.

Lepszy, specyficzny przykład:

Hierarchia kształtów diagram UML

W powyższym przykładzie Klasa Shape powinna być abstrakcyjna, ponieważ sama nie jest użyteczna.

 49
Author: Paul Sasik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-18 14:52:58

Klasa abstrakcyjna oznacza, że nie jest kompletna. Potrzebuje innej klasy, aby ją uzupełnić i / lub jej funkcjonalności. Musisz rozszerzyć klasę abstrakcyjną. Będzie to przydatne z pewną klasą np. Owoce wszystkie owoce mają tę samą właściwość, jak kolor. Ale możesz mieć różne właściwości dla różnych owoców, takich jak to jest pulpy, takie jak pomarańczowy lub nie np banan itp.

 6
Author: Nitin Chhajer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-18 14:23:50

Wiem, że to stare pytanie, ale wygląda na to, że plakat wciąż miał kilka pytań o korzyści płynące z używania klasy abstrakcyjnej.

Jeśli jesteś jedyną osobą, która kiedykolwiek użyje Twojego kodu, to naprawdę nie ma żadnej korzyści. Jednak, jeśli piszesz kod, aby inni mogli go używać, jest to korzyść. Załóżmy na przykład, że napisałeś framework buforowania, ale chcesz umożliwić klientom tworzenie własnych klas implementacji buforowania. Chcesz również śledzić niektóre metryki, takie jak ile skrytki są otwarte, hipotetycznie. Twoja abstrakcyjna klasa może wyglądać mniej więcej tak:

public abstract class AbstractCache {
    public final void open() {
        ... // Do something here to log your metrics
        openImpl();
    }

    protected abstract void openImpl() { }
}

Sama klasa AbstractCache jest bezużyteczna i nie chcesz, aby klienci próbowali utworzyć instancję i używać jej jako bufora, co byliby w stanie zrobić, gdyby klasa była konkretna. Chcesz również upewnić się, że nie mogą ominąć rejestrowania metric, które byłyby w stanie zrobić, jeśli po prostu dostarczysz im interfejs pamięci podręcznej.

 4
Author: Mike B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-03 20:37:17

Punktem abstrakcji nie jest tworzenie podklas. Chodzi bardziej o tworzenie szwów w kodzie. Chcesz, aby Kod był testowany i oddzielony od siebie, co prowadzi do ostatecznego celu konserwacji. Z podobnych powodów abstrakcja kupuje nam również możliwość zastąpienia fragmentu kodu bez marszczenia efektów ubocznych.

 3
Author: P.Brian.Mackey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-18 14:25:54

Klasa abstrakcyjna ma być używana jako klasa bazowa, z której wywodzą się inne klasy. Oczekuje się, że klasa pochodna zapewni implementacje metod, które nie są implementowane w klasie bazowej. Klasa pochodna, która implementuje wszystkie brakujące funkcje nazywa się klasą konkretną

 3
Author: Hardik Chudasama,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-22 05:38:42

Zgodnie z moim zrozumieniem

klasa abstrakcyjna jest klasą, która po prostu opisuje zachowanie, ale nie implementuje go. Rozważmy ten przykład Javy dla klasy abstrakcyjnej:

public interface DoSomething(){
public void turnOnTheLight(); 
}

zajęcia z betonu są te, które mają być realizowane. Na Przykład:

    public abstract class A(){
        public void doIt(); 
    } 
    public class B extends A(){
        public void doIt(){ 
        //concrete method
        System.out.println(“I am a Concrete Class Test”); 
    }
 }

Innymi słowy, konkretna klasa w Javie to każda taka klasa, która ma implementację wszystkich odziedziczonych elementów z interfejsu lub klasy abstrakcyjnej.

 0
Author: Devanshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-01 14:18:28