PHP интерфейс или абстрактные классы - PullRequest
0 голосов
/ 19 декабря 2011

Может ли кто-нибудь дать мне пример следующей желаемой структуры ООП, пожалуйста.

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

например.

class mainSupoerClass() {

}

class doWork exends mainSupoerClass(){
    public function addEntity(){
        //do stuff for entity
    }
}

Я хочу быть в состоянии сделать это:

$data = new mainSupoerClass;
$data->addEntity();  (doesnt belong to this class but its fetching the function from doWork class)

Может ли кто-нибудь дать мне представление о правильной структуре ООП для выполнения этой работы?

Ответы [ 4 ]

1 голос
/ 19 декабря 2011

Проще говоря, вы не можете.Вы должны создать экземпляр расширенного класса, и вы получите все функции внутри экземпляра класса, а также родительский класс / классы.

Есть ли какая-либо причина, по которой вам нужно сделать это таким образом?

1 голос
/ 19 декабря 2011

Это не сработает так, как вы это описываете.PHP (и любой другой язык) может знать, на какой производный класс вы ссылаетесь.Это будет работать, если вы создадите экземпляр doWork вместо mainSupoerClass.

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

Теперь вашему коду не нужно знать, какой это экземпляр, потому что он может вызывать любой метод, объявленный в интерфейсе / абстрактном базовом классе.

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

0 голосов
/ 19 декабря 2011

Вам придется читать. Попробуйте это:

Артикул: http://sourcemaking.com/design_patterns/abstract_factory

Код: http://sourcemaking.com/design_patterns/abstract_factory/php/2

Похоже, что шаблон дизайна фабрики - это то, что вы ищете.

Я не понимаю, почему вы хотели это сделать:

(doesnt belong to this class but its fetching the function from doWork class)

В чем причина этого?

0 голосов
/ 19 декабря 2011

Даже если он называется суперклассом, это не значит, что он имеет все классы, определенные в другом месте.Методология следующая:

[super] --> [concrete]

, а не

[concrete] --> [super]

Таким образом, конкретный класс расширяет суперкласс.В этом случае у конкретного класса будет все, что есть в суперклассе, плюс то, что конкретный класс имеет / перезаписывает, но не наоборот.

class Super
{
    public function a() {}
}

class Concrete extends Super
{
    public function b() {}
}

Super имеет ::a() и, кроме того, Concrete имеет ::b().Но Super никогда не будет иметь ::b().

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

$object = new Concrete;

Это делает Concrete объект.

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