【问题标题】:Inject class instance with protected methods使用受保护的方法注入类实例
【发布时间】:2019-01-23 06:27:17
【问题描述】:

我有两个类:“用户”和“房间”。 “Room”类经常使用“User”类,所以当我声明“Room”类时,我将“User”类实例作为其参数之一传递。

问题是“用户”类的属性/方法受到保护,因此“房间”不能使用注入的“用户”实例。

然后我必须让“房间”类扩展“用户”类,以便它可以访问受保护的东西。

既然“房间”会从“用户”那里继承所有永远不会被使用的东西,那么逻辑上说这种做法是错误的吗?还有其他方法吗?

【问题讨论】:

  • 您可以将“User”类的不可继承属性标记为“private”。

标签: php class methods protected


【解决方案1】:

将公共方法添加到 User 类,这可以由类 Room 使用,并使用所有允许的公共方法创建类接口。公共方法应该调用私有方法,而不是直接从父类调用私有方法。

【讨论】:

    【解决方案2】:

    你真的不应该让“房间”扩展“用户”。虽然这可能会起作用,但它会违反SOLID principles 的第三条规则,这基本上意味着子类应该主要表现得像父类一样。

    那么你可以做什么:

    1. 如果您有权访问类本身(例如,它不像库那样属于 3rd 方代码的一部分),您可以修改它并编写 getter 并更改方法的可见性。如果它是您的代码,这是完全合法的。依赖项会随着时间而变化,因此有时需要这样做。

    2. 使用您自己的 User 类扩展“User”并将 getter 放入其中或覆盖方法。当然,在“房间”中,您必须改用新的 User 类。

    【讨论】:

      猜你喜欢
      • 2012-06-23
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 2011-09-12
      • 2011-12-20
      • 2016-03-08
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多