Dziedziczenie klasa abstrakcyjna a interface

0

Mam taki przykład poniżej: Klasa Logger, interface interFile, Klasa abstracyjna File, i dwie klasy dziedziczące po klasie abstracyjnej o nazwach csvFile i aviFile.
Obie klasy mają za zadanie logować sobie błędy tylko :) Pytanie mam następujące, ponieważ ćwiczę sobie dziedziczenie itp czy rozszerzanie klasy abstrakcyjnej o interfejs ma sens? Czy lepiej zrobić metodę abstrakcyjną getName() w klasie abstrakcyjnej?
Nie wiem za bardzo w jakich sytuacjach stosować interfejsy a w jakich metody abstrakcyjne

class Logger
{
    private $message = '';

    public function setMsg($msg)
    {
        $this->message = $msg;
    }

    public function makeLog()
    {
        echo $this->message;
    }
}


interface interFile
{
    public function getName();
}

abstract class File implements interFile
{
    private $logger;

    public function __construct()
    {
        $this->logger = new Logger();
    }

    public function LogError($message)
    {
        $this->logger->setMsg('Start log data from ' . $this->getName() . ' -> message: ' . $message);
        $this->logger->makeLog();
    }
}

class csvFile extends File
{
    public function getName(): string
    {
        return 'file .csv';
    }
}

class aviFile extends File
{
    public function getName(): string
    {
        return 'file .avi';
    }
}

$testCsv = new csvFile();
$testCsv->LogError('im logged message from csv');

$testAvi = new aviFile();
$testAvi->LogError('im logged message from avi');
0

Takie postępowanie nie ma sensu.
Po co chcesz implementować w klasie abstrakcyjnej interfejs? definiując w niej metody abstrakcyjne możesz utworzyć takie metody co są w interfejsie i będą one bardzo podobnie działały, system zażąda ich wywołania w klasach, które po niej dziedziczą.

edit: poczytaj o dependency injection, warto tworzyć mechanizmy w oparciu o kompozycję niż o dziedziczenie.

0

A jakby tutaj wykorzystać dependency injection?

1

Na moje oko logowanie błędów nie powinno być odpowiedzialnością pliku. Wydaje mi się, że najlepiej stworzyć osobny logger i używać go w miejscach gdzie tworzysz plik, a w te miejsca wstrzykiwać zależność. Mały przykład:

class Handler
{
    private $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    public function handleFile()
    {
        try {
            $file = new File('path');
        } catch (Exception $exception) {
            $this->logger->log(LogLevel::ERROR, $exception->getMessage());
        }
    }
}

Mała ciekawostka - w PHP są pewne standardy i rekomendacje :). Do logów jest np: http://www.php-fig.org/psr/psr-3/ . Polecam :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1