![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 16 Pomógł: 2 Dołączył: 26.06.2013 Ostrzeżenie: (0%) ![]() ![]() |
Otóż mam taki kod:
I ktoś powiedział mi że lepiej abym zamiast za każdym razem ciągle pisać (kilka tych samych klas tylko z zmienioną funkcją sprawdź) to samo to lepiej skorzystać z klas abstrakcyjnych bądź interfejsów... Próbowałem taką klasę samemu jednakże nic mi nie wychodzi... Czy mógłby ktoś z kodu wyżej napisać mi coś takiego? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 559 Pomógł: 93 Dołączył: 4.03.2008 Skąd: Olsztyn Ostrzeżenie: (0%) ![]() ![]() |
interfejs odpada, bo nie zdefiniujesz tych powtarzających się metod.
W abstrakcji generalnie możesz połączyć interfejs z zwykłą klasą. Klasa abstrakcyjna może być zwykłą klasą (powiedzmy). Zatem, utworzenie klasy abstrakcyjnej:
W tej klasie robisz normalne metody, oraz metody abstrakcyjne. Metody abstrakcyjne nie posiadają ciała (definicji) a jedynie ich deklarację (nazwę, parametry, itd.). Przykład:
Następnie robisz drugą klasę która dziedziczy po tej klasie abstrakcyjnej, i tam definiujesz metodę innaMetoda Ten post edytował buliq 29.08.2013, 08:06:35 -------------------- |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 467 Pomógł: 77 Dołączył: 6.09.2008 Skąd: Miechów / Kraków Ostrzeżenie: (0%) ![]() ![]() |
Podstawowe pytanie, czy wiesz na jakiej zasadzie działają klasy abstrakcyjne oraz interfejsy? Pomysł dobry, ale nie ma potrzeby korzystania z klas abstrakcyjnych ani interfejsów. Zamiast nich możesz bezpośrednio dziedziczyć z tej klasy i nadpisywać te metody, które chcesz zmienić.
Odnośnie klas abstrakcyjnych to różnią się od zwykłych tym, że metody nie muszą mieć kodu i nie można z nich tworzyć obiektów. Można z nich jedynie dziedziczyć. Dlatego też klasa abstrakcyjna nie może być jednocześnie finalną. Co oczywiscie nie wyklucza tego, że może mieć finalne metody, pod warunkiem, że metoda nie jest abstrakcyjna ![]() Co do interfejsów to jest to spis metod publicznych, które nie mają "ciała". Nie mogą mieć one żadnego kodu oraz dostęp do nich musi być publiczny. Może wydawać się to dziwne, ale przydaje się np. do tworzenia API zewnętrznego. Każda nowa klasa w tedy musi zawierać pewien zestaw metod, które są zdefiniowane właśnie w interfejsie. Co one będą robić zależy już tylko i wyłącznie od klasy, ale wszystkie muszą być zaimplementowane. -------------------- Niemożliwym jest stworzenie czegokolwiek idiotoodpornego, ponieważ idioci są wyjątkowo pomysłowi.
https://www.aroch.pl https://themeforest.net/user/aroch https://www.astroblog.aroch.pl https://www.4geeks.pl |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 16 Pomógł: 2 Dołączył: 26.06.2013 Ostrzeżenie: (0%) ![]() ![]() |
Czyli rozumiem że jeżeli zapisałbym to tak:
To będzie wtedy działać tak samo jakbym zapisał to razem czy czegoś nie rozumiem? ![]() |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 559 Pomógł: 93 Dołączył: 4.03.2008 Skąd: Olsztyn Ostrzeżenie: (0%) ![]() ![]() |
Tak, tylko. Jeżeli definiujesz ze klasa jest abstrakcyjna, warto z tej abstrakcji skorzystać. Nie zadeklarowałeś metody sprawdz w klasie Buy. Deklaracja wymusi na każdej klasie dziedziczącej definicję tej metody.
-------------------- |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 467 Pomógł: 77 Dołączył: 6.09.2008 Skąd: Miechów / Kraków Ostrzeżenie: (0%) ![]() ![]() |
Tak. Możesz też dodać w klasie Buy metodę:
Kod abstract public function sprawdz(); W tedy jak zapomnisz jej dodać w klasie dziedziczącej to wyświetli się błąd, który Ci o tym przypomni ![]() Ten post edytował freemp3 29.08.2013, 08:56:55 -------------------- Niemożliwym jest stworzenie czegokolwiek idiotoodpornego, ponieważ idioci są wyjątkowo pomysłowi.
https://www.aroch.pl https://themeforest.net/user/aroch https://www.astroblog.aroch.pl https://www.4geeks.pl |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 16 Pomógł: 2 Dołączył: 26.06.2013 Ostrzeżenie: (0%) ![]() ![]() |
OK dzięki wam za pomoc
![]() |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 09:59 |