首页 > 解决方案 > 如何仅使接口中声明的那些公共方法可用?

问题描述

例如,在 Java 中,由于语言的静态特性,这是开箱即用的。但在 PHP 中,这也很有用,尤其是从架构的角度来看,它可以保持代码的安全和整洁。

例如,我们有以下代码:

interface DocumentProcessorInterface

   public function process();

}

class GameSaveProcessorImpl implements DocumentProcessorInterface {

    public function process() {
        // do something useful
    }

    public function methodToSetSomethingFromFriendClass() {
       // setting private fields, some postponed initialization/resetting, etc
    }

}

然后,从某个类(我们称其为“朋友类”,因为它与GameSaveProcessorImpl该类并排放置并组合它)我们调用方法methodToSetSomethingFromFriendClass。由于 PHP 的鸭子类型,这种调用此方法的能力也可用于任何外来客户端代码,但此方法不适用于此类用途。外来(外部)客户端代码必须只使用DocumentProcessorInterface方法(这是我们使用接口的原因之一)。

想到了一些解决方案。

1)保持原样,但重命名不在接口中的公共方法,因此它对那些外来客户端代码实现者起到警告作用,例如,重命名methodToSetSomethingFromFriendClassinternalUseOnly_methodToSetSomethingFromFriendClass. 降低偶尔使用的风险,但在技术上不禁止调用方法。

2)使用适配器(装饰器)模式。传递给没有methodToSetSomethingFromFriendClass方法的仅装饰实例的外部代码。它确实解决了不需要的方法访问的问题,但使我们代码的其他部分变得非常复杂。似乎没有整体利润。

3)尚未真正检查此想法的可行性:利用以下事实。基类可以声明受保护的方法,因此我们控制的所有朋友类都可以从该基类扩展,保持我们的方法methodToSetSomethingFromFriendClass标记为受保护,有效地保护免受外部代码的影响,但可以从“朋友”类调用。从技术上讲,这允许保护,但需要朋友类从公共基类继承,这样的缺点是众所周知的。

你知道什么更好的吗?感谢文章的链接以及分享有关该主题研究的经验。

标签: phpinheritanceinterfacevisibility

解决方案


推荐阅读