代码之家  ›  专栏  ›  技术社区  ›  user1032531

何时扩展接口或使用多个接口或使用接口扩展类

  •  -1
  • user1032531  · 技术社区  · 7 年前

    阅读后 http://php.net/manual/en/language.oop5.interfaces.php

    <?php
    interface Interface_A
    {
        public function aaa();
    }
    
    interface Interface_B
    {
        public function bbb();
    }
    
    interface Interface_C extends Interface_A
    {
        public function bbb();
    }
    
    class Class_A implements Interface_A, Interface_B
    {
        public function aaa(){}
        public function bbb(){}
    }
    
    class Class_B implements Interface_C
    {
        public function aaa(){}
        public function bbb(){}
    }
    
    class Class_C implements Interface_A
    {
        public function aaa(){}
    }
    
    class Class_D extends Class_C implements Interface_B
    {
        //public function aaa(){}  //Use parent
        public function bbb(){}
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   sevavietl    7 年前

    我认为,一个好的方法是 Composition over inheritance Interface segregation principle 默认情况下。这将自动 排除 “扩展接口” “使用接口扩展类” 在大多数情况下。对于其余的情况,一如既往,这取决于情况。

    接口是契约,所以当一个类实现接口时,它会向其他类显示它有适当的方法。这为 Liskov substitution principle

    根据您的示例:

    1. 如果你的一些班级 aaa() 方法和一些类都依赖于 aaa() bbb() 方法,无需依赖 bbb() 事实上,你可以独自 Interface_A 并将方法添加到其中。

    2. 如果之前的所有课程都保留,但有些课程也依赖 bbb() 独自一人,那么最好 接口\u A Interface_B 。如果您想用一个接口强制这两种方法,您可以创建一个组合的接口:

      interface interface\u C扩展interface\u A、interface\u B {

      }

    3. 这是我的主观观点,但从理解的角度来看,扩展类和实现接口有点复杂,没有真正的用处(或者我宁愿说没有真正的实用性)。通常,您实现一个接口,以便可以键入hint。如果键入提示 接口\u B 还有你的 Class_D 实现它,那么您不应该关心这个类是否实现了任何其他接口。这意味着你可以 Class_C 作为的依赖项 D类 ,并且完全可以避免使用继承。