Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: interfejs a skladowe
Forum PHP.pl > Forum > PHP > Object-oriented programming
kicaj
Projektujac klase implementujaca interfejs musi ona zawierac metody takie jak w interfejsie.
Czy jest taka mozliwosc abym wymusil na klasie zdefiniowanie zmiennej skladowej?

Dokladnie chodzi mi o to abym w kazdej klasie ktora implementuje interfejs byla zdefioniowana stala:
  1. <?php
  2. interface jakisInterface
  3. {
  4. const STALA;
  5.  
  6. function jakasMetoda();
  7. }
  8.  
  9. class jakisController implements jakisInterface
  10. {
  11. const STALA = 'wartosc';
  12.  
  13. function jakasMetoda()
  14. {
  15. // ...
  16. }
  17. }
  18. ?>

Jest to mozliwe?
NuLL
Stale sa w interfejsach jak najbardziej mozliwe w PHP5 - tak trudno sprawdzic ? ; )
kicaj
  1. <?php
  2. jakisController::STALA;
  3. ?>
Niedziala...

Niechce ustawiac wartosci "STALEJ" w interfejsie, ale chce wymusic jej istnienie w "jakisController"

Jest to mozliwe?
NuLL
Stala to stala misiu winksmiley.jpg Jej wartosci sie nie zmienia po ustawieniu smile.gif
kicaj
No to moze jakas inna propozycja tego rozwiazania?
Cezar708
stałe i zmienne w interfejsie... to nie jest możliwe. Być może czegoś nie doczytałem, ale interface jest po prostu abstrakcją zawierające tylko informacje o abstrakcyjnych metodach, które muszę się znaleźć w klasie, która ma dany zaimplementowany. Tam nic nie definiujesz. Jeśli się mylę proszę mnie uświadomić!Poza tym napisz jakie chciałbyś tego wykorzystanie... może wtedy się znajdzie jakieś
Sedziwoj
abstract
dr_bonzo
kicaj: to jest bez sensu, skoro kazda klasa implementujaca ten interfejs moze do stalej przypisac dowolna wartosc to oznacza ze ta stala ma zmienna wartosc gdy kozystasz z polimorfizmu. Uzyj np, metody getStalaWartosc() i moga ci zwracac rozne wartosci
kicaj
Dlaczego bezsensu? Jezeli w interfejsie wymuszamy istnienie metod, to dlaczego nie mozemy wymusic skladowych (tutaj akurat stalej). Interfejs jest jak "szablon" wymaga na klasie implementujacej danych metod (a ja chcialbym miec stala wymuszona w klasach implementujacych)
  1. <?php
  2. class jakasKlasa implements jakisInterface
  3. {
  4. // musze zdeklarowac stala bo wymaga tego moj interfejs 
  5. }
  6. ?>

Rozumiem ze to niemozliw i musze sobie jakos z tym inaczej poradzic:/
Sokal
O.o
Przecież interfejs narzuca tylko odpowiednie metody... Implementacja ich w różnych klasach może się różnić. Tak więc bez sensu by było wrzucanie stałej w interfejs bo to stała, jak sama nazwa wskazuje ;-)
Jak chcesz coś takiego to klasa abstrakcyjna.
Sedziwoj
methoda getCos() która zwraca to co ma być w "stałej"
NoiseMc
W interfejsie nie mozesz deklarowac zmiennych, jezeli deklarujesz stala to musisz jej wprzypisac wartosc juz w interfejsie, a jezeli chcesz wymusic na jakims zestawie klas zeby w implementacji okreslac wartosc skladowej to sprobuj uzyc klasy abstrakcyjnej.
  1. <?php
  2. interface JakisInterface
  3. {
  4. public function jakasMetoda ();
  5. }
  6.  
  7. abstract class AbstractController implements JakisInterface 
  8. {
  9. protected $skladowa;
  10.  
  11. public abstract function setSkladowa ($value);
  12. }
  13.  
  14. class JakisController extends AbstractController
  15. {
  16. public function setSkladowa ($value)
  17. {
  18. $this->skladowa = $value;
  19. }
  20.  
  21. public function jakasMetoda ()
  22. {
  23. // Implementacja metody narzuconej przez JakisInterface
  24. }
  25. }
  26. ?>

Kombinowalem jeszcze troche z deklowaniem zmiennych jako abstrakcyjne ale:
Cytat
Properties cannot be declared abstract
Interfaces may not include member variables
Ludvik
Cytat
Dlaczego bezsensu? Jezeli w interfejsie wymuszamy istnienie metod, to dlaczego nie mozemy wymusic skladowych (tutaj akurat stalej). Interfejs jest jak "szablon" wymaga na klasie implementujacej danych metod (a ja chcialbym miec stala wymuszona w klasach implementujacych)

Nie wiem, czy porównanie interfejsu do szablonu jest zbyt dobrym pomysłem. Interfejs określa operacje, które możesz wykonywać na obiekcie implementującym go. Składowe nie mają nic wspólnego z interfejsem obiektu - raczej określają jego stan. Stałe to już kompletnie inna bajka. Stała jest stałą, reprezentuje coś, co się nie zmienia. Cechy obiektów powinny być zwracane przez odpowiednie akcesory.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.