Dobry przykład można znaleźć we wzorze dekoratora, patrz tutaj . Obie WindowDecoratori CoffeeDecoratorsą abstractklasami, 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.
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 :
publicabstractclassAbstractClass{publicString nonAbstractMethodOne(String param1,String param2){String param = param1 + param2;return param;}publicstaticvoid nonAbstractMethodTwo(String param){System.out.println("Value of param is "+param);}}
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ć.
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.
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ą
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.
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.
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
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.
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.
WindowDecorator
iCoffeeDecorator
sąabstract
klasami, ale żadna nie zawieraabstract
metody.Odpowiedzi:
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
final
metodami, ale nigdy na odwrót.źródło
Tak, możesz to zrobić. Dlaczego po prostu nie spróbujesz tego zrobić?
źródło
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 :
Jest okej.
źródło
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ć.
źródło
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.
źródło
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
źródło
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.
źródło
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:
to na pewno zadziała.
źródło
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
źródło
Tak, możesz zdefiniować klasę abstrakcyjną bez metody abstrakcyjnej. Jeśli jednak w środku nie ma metody, lepiej użyj interfejsu
źródło
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.
źródło
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.
źródło