![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 602 Pomógł: 30 Dołączył: 1.08.2007 Skąd: Nowy Sącz Ostrzeżenie: (0%) ![]() ![]() |
Witam mam takie klasy(klasy są pisane dla przykładu z głowy).
I to jest klasa główna, wszystkie punkty będą miały te cechy($x,$y, $type) Będą punkty które posiadają tylko te cechy np:
i tutaj nie ma problemu. Ale będą punkty które będą posiadały dodatkowe cechy np wysokośc, kolor, obrazek, zależnie od użytego grafu(mam różne typy grafów).
I podczas użycia odpowiedniego grafu wybieram odpowiedni opis punktu np
Pytanie mam właśnie do tego momętu: Gdy ktoś poda jako $classPunkt klasę StandardowyPunkt a klasa GrafGalileusza musi używać klasy RozszezonyPunkt, to wystąpi błąd.
Sam się strasznie gmatwam z tym. Myślałem, żeby zrobić jedną klasę Punkt i do niej dodawać wszystkie cechy punktu które będe używał, lub ktoś sobie doda gdy będzie potrzebował innej cechy.
Tylko czy tutaj użytkownik nie ma za wielkiej swobody? Co możecie mi polecić? Chyba, że na stałe ustalać w klasie GrafGalileusza jaka klasa punktu ma być używana i np zrobic PunktGalileusza
Pytania pogrubiłem. Proszę o odpowiedź i dziękuje. Ten post edytował daniel1302 26.12.2011, 13:08:10 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Ciężko jednoznacznie odpowiedzieć na Twoje pytania, bo wszystko zależy od założeń tego projektu. Zauważ tylko, że jeśli GrafGalileusza składa się tylko z punktów rozszerzonych, to ani użytkownik, ani jakaś klasa/metoda pośrednia nie powinny mieć możliwości podania z jakiej klasy punktu korzystamy tworząc ten graf. Przecież to musi być właśnie RozszerzonyPunkt i koniec. W tym przypadku trzeba tylko zweryfikować, czy dane zawarte w pliku xml, służącym do wygenerowania grafu, rzeczywiście odpowiadają klasie RozszerzonyPunkt. Można ewentualnie odpowiednią informację umieścić w tym pliku xml. Wszystko jednak zależy od Twoich potrzeb.
Przykład jest troszkę niedopracowany, więc ciężko tutaj dywagować na jakiekolwiek temat. Ten post edytował mortus 26.12.2011, 14:17:25 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
PHP nie wspiera żadnego mechanizmu w stylu typów generyczych z Javy czy szablonów z C++. Ciężko więc w czasie wykonywania o zarządzanie typami.
1. Jakiś taki dziwny ten graf się wydaje... taki nie grafowaty (IMG:style_emoticons/default/wink.gif) Ani tu wierzchołków tylko punkty, ani tu krawędzi tylko mapa. Zmień nazwę na mapę czy jakiś układ punktów, bo trochę mylące to jest w tej chwili. 2. Konstruktor obiektu mapy (tu: grafu) raczej nie powinien zajmować się pobieraniem danych z pliku i uzupełnianiem siebie. Bo co jak zmienisz sobie źródło albo format danych? Dane wprowadzaj z zewnątrz. 3. Do sprawdzenia czy dana klasa dziedziczy po innej możesz skorzystać z mechanizmu refleksji (Reflection API) albo funkcji is_subclass_of. Tworzenie obiektu tylko po to by sprawdzić czy jego typ jest odpowiedni to zły pomysł - szczególnie dlatego, że trzeba by uwzględnić argumenty konstruktora oraz fakt, że tworzenie tego typu obiektu może być kosztowne. 4. Mapa oraz Punkt powinny być interfejsami. 5. Wiem, że to przykład, ale nigdy nie powinieneś rzucać wyjątkami klasy Exception. Co do samego problemu. W pełni statycznego typowania po prostu w PHP w tym przypadku nie osiągniesz. Mógłbyś próbować robić jakieś protezy typu __construct(RozszerzonyPunkt $punktBazowy) i później klonować ten obiekt w momencie gdy potrzebna Ci nowa instancja, ale to strasznie kulawe i podatne na błędy rozwiązanie. Przekaż odpowiednią klasę (przez mechanizm refleksji) i w czasie wykonywania sprawdzaj: PHP nie ma możliwości osiągnięcia tutaj statycznego, silnego typowania - język na to nie pozwala. Ten post edytował Crozin 26.12.2011, 14:34:09 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 8.10.2025 - 22:14 |