Definiowanie klasy abstrakcyjnej bez metod abstrakcyjnych

114

Czy mogę zdefiniować klasę abstrakcyjną bez dodawania metody abstrakcyjnej?

VisaMasterCard
źródło
1
Dobry przykład można znaleźć we wzorze dekoratora, patrz tutaj . Obie WindowDecoratori CoffeeDecoratorabstractklasami, ale żadna nie zawiera abstractmetody.
MS Dousti

Odpowiedzi:

168

Oczywiście.

Zadeklarowanie klasy abstrakcyjnej oznacza tylko, że nie zezwalasz na jej samodzielne tworzenie instancji.

Zadeklarowanie abstrakcyjnej metody oznacza, że ​​podklasy muszą zapewniać implementację dla tej metody.

Te dwa pojęcia są oddzielnymi koncepcjami, chociaż oczywiście nie można mieć metody abstrakcyjnej w klasie nieabstrakcyjnej. Możesz nawet mieć klasy abstrakcyjne z finalmetodami, ale nigdy na odwrót.

biziclop
źródło
14

Tak, możesz to zrobić. Dlaczego po prostu nie spróbujesz tego zrobić?

Marc W.
źródło
6
I to nie tylko OP. Spójrz na wszystkie pozytywne głosy, jakie otrzymało pytanie!
Marc W
54
@ karim79 Nie ma potrzeby wysokich koni i tych wszystkich sosów. Wypróbowanie tego nie do końca ujawnia, dlaczego jest to dozwolone, a jednocześnie zadaje sobie pytanie.
biziclop
7
@bizclop - samodzielne wypróbowanie tego rozwiązania mogłoby dać bardziej produktywne pytanie. Nie ma wysokich koni. To jest całkiem proste. Jego pytanie brzmiało „Czy mogę” zamiast „Dlaczego to…”.
karim79
8
Jeśli na pytanie można odpowiedzieć prostym tak lub nie, osoba pytająca powinna rozważyć przeformułowanie, użycie Google lub po prostu wypróbowanie tego.
Tyler Treat,
3
@ karim79 Tak, pytanie mogłoby zostać sformułowane lepiej, ale myślę, że nie trzeba wiele wysiłku, aby spojrzeć o krok do przodu.
biziclop
8

Tak, możesz. Klasa abstrakcyjna używana w Javie oznacza, że ​​nie można utworzyć obiektu tej klasy. I abstrakcyjna metoda, której podklasy muszą zapewniać implementację dla tej metody.

Możesz więc łatwo zdefiniować klasę abstrakcyjną bez żadnej metody abstrakcyjnej.

Jak na przykład :

public abstract class AbstractClass{

    public String nonAbstractMethodOne(String param1,String param2){
        String param = param1 + param2;
        return param;
    }

    public static void nonAbstractMethodTwo(String param){
        System.out.println("Value of param is "+param);
    }
}

Jest okej.

Shreyos Adikari
źródło
6

TAK Możesz stworzyć klasę abstrakcyjną bez żadnej metody abstrakcyjnej najlepszym przykładem klasy abstrakcyjnej bez metody abstrakcyjnej jest HttpServlet
Metoda abstrakcyjna to metoda, która nie ma treści. Jeśli zadeklarowałeś przynajmniej jedną metodę w klasie, klasa musi być zadeklarowana jako abstrakcja jest obowiązkowa, ALE jeśli zadeklarowałeś klasę abstrakcyjną, nie jest obowiązkowe zadeklarowanie metody abstrakcyjnej wewnątrz klasy.

Nie można tworzyć obiektów klasy abstrakcyjnej, co oznacza, że ​​nie można ich utworzyć.

JegsVala
źródło
4

Tak, możesz zadeklarować klasę, której nie możesz utworzyć samodzielnie, używając tylko metod, które mają już implementacje. Byłoby to przydatne, gdybyś chciał w przyszłości dodać metody abstrakcyjne lub jeśli nie chcesz, aby klasa była tworzona bezpośrednio, mimo że nie ma ona właściwości abstrakcyjnych.

Gordon Gustafson
źródło
Nie chodziło o puste klasy abstrakcyjne, tylko o klasy abstrakcyjne bez metod abstrakcyjnych. O ile widzę, nie ma żadnego uzasadnionego powodu dla używania całkowicie pustej klasy abstrakcyjnej.
biziclop
1
Odpowiedź naprawiona. Używanie pustej klasy abstrakcyjnej może być przydatne, jeśli masz dobry powód, aby chcieć później dodać metody abstrakcyjne i nie musisz zajmować się refaktoryzacją innych klas nadrzędnych.
Gordon Gustafson
1
W środku hierarchii całkowicie pusta (z wyjątkiem specyfikacji dziedziczenia) klasa abstrakcyjna może mieć sens, jeśli derywacje tej klasy będą miały inne zobowiązania umowne niż inne pochodne jednostki macierzystej.
supercat
3

tak, możemy zadeklarować klasę abstrakcyjną bez żadnej metody abstrakcyjnej. celem deklarowania klasy jako abstrakcyjnej nie jest utworzenie instancji klasy.

więc dwa przypadki

1) klasa abstrakcyjna z metodami abstrakcyjnymi.

tego typu klasy, musimy odziedziczyć klasę z tej klasy abstrakcyjnej i musimy nadpisać metody abstrakcyjne w naszej klasie, np .: klasa GenricServlet

2) klasa abstrakcyjna bez metod abstrakcyjnych.

tego typu klasy, musimy odziedziczyć klasę z tej klasy abstrakcyjnej, np .: klasa HttpServlet celem wykonania jest to, że jeśli nie zaimplementujesz logiki w klasie potomnej, możesz uzyskać logikę nadrzędną

proszę sprawdzić kod źródłowy HttpServlet

Manoj Kalluri
źródło
2

Tak, możemy mieć klasę abstrakcyjną bez metod abstrakcyjnych, ponieważ obie są niezależnymi koncepcjami. Zadeklarowanie abstrakcji klasy oznacza, że ​​nie można jej samodzielnie utworzyć instancji i można ją jedynie podzielić na podklasy. Zadeklarowanie abstrakcyjnej metody oznacza, że ​​Method zostanie zdefiniowana w podklasie.

Vivek Vermani
źródło
Dlaczego nie powinienem chcieć, aby nie można było utworzyć instancji klasy? Jakiś dobry powód, na przykład?
karlihnos
1

Tak, możesz to zrobić.

zadeklarowanie klasy abstrakcyjnej oznacza, że ​​żadna inna klasa nie utworzy instancji klasy.

i powinna być w niej co najmniej jedna metoda abstrakcyjna, a znaczenie tego możesz zadeklarować metodę abstrakcyjną w tej klasie, jeśli nie deklarujesz metody niż jest w porządku.

przykład:

public abstract class abs {

    protected int cx = 0, cy = 0;

    public void p() {
        System.out.print("hello");
    }
}

to na pewno zadziała.

Kishan Dhamat
źródło
1

Tak, możesz. Czasami możesz otrzymać pytanie, jaki jest cel tego działania? Odpowiedź brzmi: czasami musimy ograniczyć klasę do samodzielnego tworzenia instancji. W takim przypadku chcemy, aby użytkownik rozszerzył naszą klasę Abstract i utworzył instancję klasy potomnej

Nandkishor Gokhe
źródło
1

Tak, możesz zdefiniować klasę abstrakcyjną bez metody abstrakcyjnej. Jeśli jednak w środku nie ma metody, lepiej użyj interfejsu

fmucar
źródło
4
Niezły pomysł na zajęcie minimum 30 znaków.
Marc W
1
Jeśli nie ma metody abstrakcyjnej, w jaki sposób można użyć interfejsu? Interfejs ma domyślnie wszystkie metody abstrakcyjne.
Usman Rana
1

Możesz, myślę, że bardziej powinieneś. Od samego początku powiem, że nie ma twardej i szybkiej odpowiedzi. Zrób właściwą rzecz w swojej obecnej sytuacji.

Dla mnie dziedziczenie oznacza związek „jest-jest”. Wyobraź sobie klasę psów, którą można rozszerzyć o bardziej wyspecjalizowane podtypy (alzacki, pudel itp.). W tym przypadku stworzenie abstrakcyjnej klasy psów może być właściwe, ponieważ podtypy to psy. Teraz wyobraźmy sobie, że psy potrzebują obroży. W tym przypadku dziedziczenie nie ma sensu: nonsensem jest utrzymywanie relacji „jest-a” między psami a obrożami. Jest to z pewnością relacja „ma-a”, kołnierz jest przedmiotem współpracy. Tworzenie abstrakcyjnych obroży tylko po to, aby psy mogły ją mieć, nie ma sensu.

Często stwierdzam, że klasy abstrakcyjne bez metod abstrakcyjnych w rzeczywistości wyrażają relację typu „ma”. W takich przypadkach zwykle okazuje się, że kod można lepiej rozłożyć na czynniki bez stosowania dziedziczenia. Uważam również, że klasy abstrakcyjne bez metody abstrakcyjnej są często zapachem kodu i przynajmniej powinny prowadzić do zadawania pytań podczas przeglądu kodu.

Ponownie, jest to całkowicie subiektywne. Mogą zaistnieć sytuacje, w których klasa abstrakcyjna bez metod abstrakcyjnych ma sens, zależy to wyłącznie od interpretacji i uzasadnienia. Podejmij najlepszą decyzję niezależnie od tego, nad czym pracujesz.

Jeremy
źródło
1

Właściwie nie ma żadnego znaczenia, jeśli klasa abstrakcyjna nie ma żadnej metody abstrakcyjnej. Klasa abstrakcyjna jest jak ojciec. Ten ojciec ma pewne cechy i zachowania, kiedy ty jako dziecko chcesz być dzieckiem ojca, ojciec mówi, że dziecko (ty) musi być takie, to nasze MOTO, a jeśli nie chcesz, to ty nie są moim dzieckiem.

Mohammad Davari
źródło