【问题标题】:Is it okay for a subclass to implement an interface?子类可以实现接口吗?
【发布时间】:2011-06-15 23:46:22
【问题描述】:

我正在涉足更严重的 OOP(以前,只是使用继承),但我偶然发现了一些让我感到困惑的事情。

我有一个处理我的数据库连接的超类。

我有一个处理与网站会员功能相关的连接的子类

我想采用策略模式来允许不同但相似的功能共存。例如:

  • 连接到数据库并检查名称 和新注册的电子邮件
  • 连接数据库并检查用户名和确认码以确认注册
  • 连接数据库并检查登录用户名和密码

【问题讨论】:

  • 我没有想过这个,我也有兴趣看看
  • 您的问题标题与您的问题正文无关。

标签: php oop strategy-pattern


【解决方案1】:

抽象类能否在 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

【讨论】:

    【解决方案2】:

    在不知道您的代码的情况下,这很难回答。根据我从您的问题中可以得出的结论,我想说在这种情况下您应该使用组合而不是继承。

    您可以拥有各种“服务类”,这些“服务类”结合了数据库连接以进行与特定问题域相关的查询。他们都有一个属性$dbConnection 可以用来进行查询。您可以使用依赖注入从外部设置该属性,可以使用 setter 方法 (setDbConnection($dbConnection)),也可以直接在各种服务对象的构造函数中将其作为参数传递。

    【讨论】:

    • 在策略范式中我会为此使用接口,这不是吗?
    • 理想的做法是为整个页面请求只连接一次数据库。不确定策略范式,但您可以向抽象基类添加一个方法 setDbConnection,该方法可用于子类的实例。或者,可以设置抽象类的构造函数接受dbConnection作为参数。
    猜你喜欢
    • 2010-09-16
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多