• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Klasa abstrakcyjna php

Cloud VPS
0 głosów
880 wizyt
pytanie zadane 31 lipca 2018 w PHP przez Adam Ostrogórski Obywatel (1,070 p.)

Witam,

stworzyłem klasę abstrakcyjną:

abstract class  Wzor {

    public $parametr;

    function __construct()
    {

    }

    public function wykonaj($parametr) {
      
    }

Na jej podstawie chcę stworzyć klasy potomne, które różnią się jedynie $parametr w funkcji wykonaj(). W jaki sposób dla każdej klasy dziedziczącej po klasie abstrakcyjnej Wzor.php można to podstawić?

Próbowałem m.in. w klasie potomnej przez przypisanie 

public $parametr = 'wartosc';

Ale nie podstawia tej wartości przy wywołaniu metody wykonaj() na obiekcie klasy potomnej. Tylko muszę ją zawsze podać przy wywoływaniu metody.

Czy wiecie, jak można tego dokonać?

1 odpowiedź

+1 głos
odpowiedź 31 lipca 2018 przez Arkadiusz Waluk Ekspert (290,310 p.)
Nie zrobisz tego w taki sposób. Skoro zmienną $parametr przekazujesz z zewnątrz to po prostu musisz odpowiednią przekazać przy wywołaniu tej metody na zewnątrz. Można też w konkretnej implementacji (klasie która dziedziczy po Wzor) zadeklarować np. konstruktor albo zrobić setter i ustawiać właściwość. Albo zmienić tak, aby ten parametr nie był argumentem metody a właściwością klasy, wtedy będziesz sobie mógł deklarować tak jak pokazałeś jako nadpisanie właściwości. Wszystko zależy od kontekstu i tego co chcesz zrobić, przeważnie nie ma jednego rozwiązania tylko na wiele sposobów można do tego podejść.
komentarz 31 lipca 2018 przez Adam Ostrogórski Obywatel (1,070 p.)

Rozumiem. Dzięki.

Czyli jeśli chciałbym stworzyć klasy potomne dziedziczące po Wzór, które różnią się jedynie parametrem w metodzie wykonaj(), to jest to możliwe do zrobienia, czy nie powinienem tworzyć klasy abstrakcyjnej, tylko zwykłą, ponieważ i tak trzeba będzie przy tworzeniu obiektu podać ten parametr? 

Jeśli jednak jest możliwe ustawienie w klasach potomnych innych wartości tego parametru przekazywanego do metody, to poprzez przypisanie wartości w konstruktorze powinno to wyglądać w ten sposób:

class Potomna extends Wzor {

    public $parametr;

    function __construct()
    {
        $this->parametr= 'wartosc';
    }

    public function wykonaj($parametr) {
        
    }


}

czy robię coś źle? Ponieważ wyświetla błąd: Uncaught ArgumentCountError: Too few arguments to function - tak, jakby nie podstawiało tej wartości przekazanej w konstruktorze.

Dziękuję za pomoc.

komentarz 31 lipca 2018 przez Arkadiusz Waluk Ekspert (290,310 p.)
Źle, bo on sam się nie domyśli że argument $parametr w metodzie to akurat ta właściwość. Wtedy już nie przekazujesz do metody argumentu, tylko w metodzie dostaniesz się do tego przez $this->parametr.

A jeśli chodzi o samo podejście do tego to jak mówiłem, zależy co robisz. Jeśli masz tylko jedną klasę (nie ma np. wielu typów, różnych operacji w zależności od tego co zostało przekazane, czy czegoś, co mogłoby być rozszerzane) to zrobiłbym jedną klasę i do niej przekazał odpowiednie dane z zewnątrz. Jeśli to jest zwykły string czy coś to po prostu można go przekazać bez kombinowania z takimi rzeczami, nie wiem co ma Ci to zaoszczędzić. Jeśli przekazujesz do tego obiekt to wtedy możesz zrobić interfejs albo klasę abstrakcyjną, ale dla tego obiektu. Wszystkie jego implementacje będą wtedy mogły być przekazane podając jako argument klasę bazową.
komentarz 31 lipca 2018 przez Adam Ostrogórski Obywatel (1,070 p.)
Dziękuję za pomoc i wyjaśnienie.

Podobne pytania

0 głosów
2 odpowiedzi 562 wizyt
pytanie zadane 12 czerwca 2017 w C i C++ przez Akiro Bywalec (2,910 p.)
+1 głos
1 odpowiedź 226 wizyt
0 głosów
1 odpowiedź 180 wizyt

93,487 zapytań

142,422 odpowiedzi

322,773 komentarzy

62,908 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...