Это нормально для подкласса для реализации интерфейса? - PullRequest
1 голос
/ 26 января 2011

Я погружаю свои пальцы в более серьезную ООП (ранее, только что использовал наследование), и я наткнулся на то, что меня смутило.

У меня есть суперкласс, который обрабатывает мое соединение с базой данных.

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

Я хотел бы использовать шаблон стратегии, чтобы позволить сосуществовать различным, но похожим функциям. Например:

  • подключиться к базе данных и проверить имя и электронная почта для новых регистраций
  • подключение к базе данных и проверка имени пользователя и кода подтверждения для подтверждения регистрации
  • подключиться к базе данных и проверить имя пользователя и пароль для входа в систему

Ответы [ 2 ]

2 голосов
/ 26 января 2011

может ли абстрактный класс расширить суперкласс в PHP?

Это

class A {}
abstract class B extends A {}
class C extends B {}

var_dump( new C );

дает

object(C)#1 (0) {}

поэтому ответ таков: Да, абстрактный класс может расширять суперкласс в PHP.

РЕДАКТИРОВАТЬ после обновления заголовка:

Да, для подкласса совершенно нормально реализовать интерфейс. Однако в контексте стратегии вы, скорее всего, не будете вызывать методы на любом другом интерфейсе, кроме интерфейса, который захватывает абстракцию и скрывает детали реализации в производных классах . См http://sourcemaking.com/design_patterns/strategy

0 голосов
/ 26 января 2011

Не зная вашего кода, на это сложно ответить. Из того, что я могу извлечь из вашего вопроса, я бы сказал, что в этом случае вы должны использовать композицию вместо наследования.

У вас могут быть различные «классы обслуживания», которые включают соединение с базой данных для выполнения запросов, относящихся к конкретной проблемной области. Все они имеют свойство $dbConnection, которое они могут использовать для выполнения запросов. Вы устанавливаете это свойство извне, используя внедрение зависимостей, либо с помощью метода установки (setDbConnection($dbConnection)), либо передавая его в параметре непосредственно в конструктор различных сервисных объектов.

...