Какой лучший способ множественного наследования в php? - PullRequest
3 голосов
/ 13 октября 2019

У меня есть основной класс, который должен быть расширен на 3 конкретных класса.

Основное требование:

-Для ООП мне нужно продемонстрировать структурирование кода в значимых классах, расширяющих друг друга, так что это будет абстрактный класс для логики основного продукта. Подход для этого мог бы иметь базовый класс продукта, который содержал бы всю логику, общую для всех продуктов, а затем конкретный тип продукта расширил бы базовый класс продукта с помощью этого специфического для типа материала.

- Идеясоздать абстрактный класс со всей общей логикой продукта, такой как getTitle, setTitle и т. д. Затем создайте дочерние классы продукта для каждого типа продукта, чтобы хранить логику, специфичную для типа продукта, такую ​​как размеры мебели, размер компакт-диска, вес книги и т. д.

Эту задачу я решил с помощью php черты :

Main.php

class Main 
{
    use Book;
    use Disc;
    use Furniture;
    // common properties and methods
}

Disc.php

trait Disc
{
    public function setSize($size)
    {
        $this->size = $size;
    }  
}

Book.php

trait Book
{
    public function setWeight($weight)
    {
        $this->weight = $weight;
    }
}

Furniture.php

trait Furniture
{
    public function setHeight($height)
    {
        $this->height = $height;
    }
    public function setWidth($width)
    {
        $this->width = $width;
    }
    public function setLength($length)
    {
        $this->length = $length;
    }
}

Iрешили эту проблему с помощью таких интерфейсов:

Main.php

class Main
{
   // common properties
}

Types.php

interface Weight
{
    public function setWeight($weight);
}
interface Size
{
    public function setSize($size);
}
interface Fdim extends Weight,Size
{
    public function setHeight($height);
    public function setWidth($width);
    public function setLength($length);
}
class Furniture extends Main implements fdim
{
    public function setWeight($weight)
    {
        $this->weight = $weight;
    }
    public function setSize($size)
    {
        $this->size = $size;
    } 
    public function setHeight($height)
    {
        $this->height = $height;
    }
    public function setWidth($width)
    {
        $this->width = $width;
    }
    public function setLength($length)
    {
        $this->length = $length;
    }
}

Является ли это лучшим решением с интерфейсами, отвечающим вышеуказанным требованиям?

Что является более приемлемымего или интерфейсы? Что вы порекомендуете?

У меня есть вопрос: есть ли лучшее решение этой задачи с указанным выше требованием? Я также пробовал абстрактные классы и интерфейсы, но, по моему мнению, требования более удовлетворены чертами. Что вы рекомендуете?

Ответы [ 2 ]

3 голосов
/ 13 октября 2019

Как я уже писал в комментарии, я бы предложил что-то вроде этого:

abstract class Product
{
    // Get/Set title, SKU, properties which are common for *all* products
}

Затем некоторые интерфейсы:

interface HavingWeight
{
    // Get/Set weight
}

Черты:

trait WithWeigth
{
    // Get/Set weight implementation
}

Тогда конкретный класс Book:

class Book extends Product implements HavingWeight
{
   use WithWeight;
}

Использование интерфейсов имеет очень важное преимущество: использование может затем использовать код, подобный следующему:

if($product instanceof HavingWeight)
{
    // Show weight
}
2 голосов
/ 13 октября 2019

Как упоминалось Никос М , PHP не поддерживает множественное наследование (по крайней мере, до сих пор), и, как вы, возможно, заметили, traits и интерфейсы будут единственным способом симулировать множественное наследование.

  • Используйте черты , если одна и та же логика требуется для использования несколькими классами (которые не расширяют и не наследуют друг друга).
  • Вы можете использовать интерфейсы тоже, но это будет означать, что вы не сможете использовать одну и ту же логику функций между различными классами (что заставит вас сделать несколько копий-вставок или придумать какой-то другой обходной путь).
...