[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Определение Интерфейсов класса
Страницы: 1, 2, 3
MAD_B
Буду признателен за помощь.

Такая задача

Определить интерфейсы, которые реализует класс
(НО только те, которые в самом классе)

Например


interface A1 {}
interface A2 {}
interface B1 {}
interface B2 {}
interface C1 {}
interface C2 {}

class A implements A1, A2 {}
class B extends A implements B1, B2 {}
class C extends B implements C1, C2 {}

$refl = new ReflectionClass('C');

//$intr = $refl->getInterfaces();
$intr2 = $refl->getInterfaceNames();

print_r($intr2);


// Получаем
Array
(
[
0] => B2
[1] => B1
[2] => A1
[3] => A2
[4] => C1
[5] => C2
)


А нужно только С1 и С2

Ищу простое решение, без костылей.



Игорь_Vasinsky
class B extends A implements B1, B2 {}
class C extends B implements C1, C2 {}

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
MAD_B
Игорь_Vasinsky, что вы хотели этим сказать?
Игорь_Vasinsky
ты унаследовал интерфейсы

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
MAD_B
Я все правильно унаследовал, будьте внимательны
Игорь_Vasinsky
тебе наверн абстрактные классы нужны

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Игорь_Vasinsky
Цитата
интерфейс представляет набор сигнатур функций, которые необходимо реализовать при имплементации. это не класс, это отдельная сущность. реализация методов в конкретных классах может быть абсолютно различной. общей является только сигнатура метода. в интерфейсе не может быть свойств (полей, констант).

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

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


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
MAD_B
Мне наверн нужно то, о чем я написал в первом посте.
Игорь_Vasinsky
Цитата
ты унаследовал интерфейсы

Цитата
соответственно нужно учитывать, что при добавлении новой сигнатуры метода в интерфейс, его придется реализовать во всех классах


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
kaww
Вряд ли есть красивый вариант. Но можно например так
$refl = new ReflectionClass('C');

$int1 = $refl->getInterfaceNames();
$parent = $refl->getParentClass();

$refl2 = new ReflectionClass($parent->getName());
$int2 = $refl2->getInterfaceNames();
var_dump(array_diff($int1, $int2));


UPD.
Оказывается метод getParentClass возвращает экземпляр ReflectionClass, поэтому нужно так:
$refl = new ReflectionClass('C');

$int1 = $refl->getInterfaceNames();
$parent = $refl->getParentClass();

var_dump(array_diff($int1, $parent->getInterfaceNames()));

Guest
не получится так сделать. Это бы нарушало принципы ООП.
Игорь_Vasinsky
для чего вообще это?
чисто для получения инфы?

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Гость_джоник
Игорь, возможно это тестовое задание.
MAD_B
Guest А какой конкретно принцип нарушается?


kaww Благодарю за ответ, примерно так и собираюсь делать, через анализ родительских классов. Похоже простых путей нет.


Игорь_Vasinsky Отвечу на ваш последний вопрос, несмотря на кучу комментариев 'не в тему'. Практическое применение:

Построение диаграмм классов без 'избыточных отношений'

Чтоб было так:
user posted image

А не так:
user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.