- Kiedy należy
implement
lubextend
należy używać? - Jakie są przykłady z prawdziwego świata?
Czy to jest poprawne?
Wydaje się, że implementacja jest sposobem na wymuszenie istnienia pewnych metod w klasie i prawidłowego sformatowania wywołań funkcji tych metod. Implementacja nie jest jednak sposobem przekazywania zmiennych lub „ustawień” do klasy?
Oczekiwany scenariusz z życia: Mam platformę handlu elektronicznego zawierającą wiele klas płatności, które mają ten sam projekt. Kiedy należy dodać nową klasę płatności, bardzo łatwo jest zastosować się do zdefiniowanego projektu, interface
aby upewnić się, że wszystkie bity i elementy są dostępne od początku.
Rozszerzanie klas powoduje, że klasa rozszerzona (potomna?) Dziedziczy wszystko z klasy nadrzędnej z wyjątkiem metod i zmiennych zadeklarowanych jako private
?
Oczekiwany scenariusz z życia wzięty: wywołałem jedną klasę sessions
z dwiema klasami podrzędnymi o nazwach sessioncookies
i databasesessions
. sessioncookies
i databasesessions
razem dziedziczą szereg wzajemnych opcji konfiguracyjnych z sesji nadrzędnych, ułatwiając zmianę opcji konfiguracji, aby wpływać na wszelkiego rodzaju ostateczne przechowywanie danych odwiedzających.
Odpowiedzi:
Dziedziczenie jest przydatne, aby zmniejszyć ilość przepisywanego kodu. Jeśli masz kilka klas z kilkoma typowymi metodami lub polami, zamiast nieustannie definiować te metody i pola, możesz uwzględnić je w klasie bazowej i sprawić, by każda z klas potomnych rozszerzała tę klasę bazową.
Interfejsy (i
implements
) są przydatne, gdy chcesz zdefiniować wspólny protokół jak powinna zachowywać się grupa obiektów. Na przykład możesz chcieć nakazać, aby obiekty, które są porównywalne, można było porównywać pod kątem równości i haszowania itp.Ostatecznie korzystanie z dziedziczenia jest wyborem projektu. Szukaj przypadków, w których definiujesz te same metody w kilku klasach; są to doskonałe przypadki, w których można podzielić te metody na klasę bazową. To samo dotyczy klas, które mają niektóre z tych samych cech: możesz zagwarantować spójność, umieszczając te cechy w interfejsie, który ma być implementowany przez te powiązane klasy.
Dziedziczenie to wielka koncepcja w OOP, która wykracza poza samo PHP. Polecam przeczytanie artykułu na Wikipedii o dziedziczeniu i być może wzorcach projektowych Gang of Four .
Uważam, że twoje rozumienie dziedziczenia jest głównie poprawne. Następnym krokiem byłoby użycie go w produkcji.
źródło
Wprowadzić w życie:
Interfejsy są klasami abstrakcyjnymi, więc możesz tylko deklarować rzeczy. Klasa implementuje interfejs. Możesz zaimplementować wiele interfejsów.
Poszerzać:
Ci przedłużyć klas gdy chcesz więcej wersji konkretnego z klasą.
Przykład:
// Contract: a pet should play public interface Pet { public void play(); } // An animal eats and sleeps class Animal { public void eat(); public void sleep(); } public class Camel extends Animal { } public class Dog extends Animal implements Pet { public void play() {...} }
Zarówno Camel, jak i Dog są zwierzętami, więc poszerzają
Animal
klasę. Ale tylko psa jest rodzajem specyficznego ofAnimal
która również może byćPet
źródło