为什么在以下条件下用于接口而不是类



我想显示一个 name.name 可能是大写或小写的,这将取决于我将通过哪个类.我必须接近一个是使用class,第二个是interface哪个更好,为什么?

  1. 使用类的解决方案

    class User{
    }
    class Iuser extends User{
        private $name;
        function  __construct($name){
            $this->name = $name;
        }
        function getName(){
            return strtoupper($this->name);
        }
    }
    class Wuser extends User{
        private $name;
        function  __construct($name){
            $this->name = $name;
        }
        function getName(){
            return strtolower($this->name);
        }
    }
    class Name{
      public $u;
      function  __construct(User $u){
          $this->u = $u;
      }
      function getName(){
          $name  = $this->u->getName();
          return "Hi My Name is ".$name; 
      }
    }
    $name = "Deval Patel";
    $iu = new Iuser($name);
    $wu = new Wuser($name);
    $user = new Name($wu);
    echo $user->getName();
    

  2. 使用接口的解决方案

    interface User{
        public function getName();
    }
    class Iuser implements User{
        private $name;
        function  __construct($name){
            $this->name = $name;
        }
        function getName(){
            return strtoupper($this->name);
        }
    }
    class Wuser implements User{
        private $name;
        function  __construct($name){
            $this->name = $name;
        }
        function getName(){
            return strtolower($this->name);
        }
    }
    class Name{
      public $u;
      function  __construct(User $u){
          $this->u = $u;
      }
      function getName(){
          $name  = $this->u->getName();
          return "Hi My Name is ".$name; 
      }
    }
    $name = "Deval Patel";
    $iu = new Iuser($name);
    $wu = new Wuser($name);
    $user = new Name($iu);
    echo $user->getName();
    

使用接口解决方案,getName() 方法已定义但未在用户界面中实现(未显示在代码中),因此实现它的每个类都必须定义获取名称的行为,同时使用抽象类,您可以定义获取名称的标准方法,并在必要时在子类中重写或重载该方法。

所以对于你的代码,我认为最好的解决方案是抽象。

请记住,当您想要强制开发人员对 getName() 方法进行编码时,请使用接口,对于抽象类,只需允许开发人员使用父方法 getName(),或者在必要时覆盖/重载。接口为您提供了更多的控制和代码重用。

查看 PHP 对象接口文档和 PHP 类抽象文档,它可能会阐明您的疑问。

我会使用类,因为你可以重用一些代码。

abstract class User
{
    protected
        $name;
    public function __construct($name)
    {
        $this->name = $name;
    }
    abstract function getName();
}
class Iuser extends User
{
    public function getName()
    {
        return strtoupper($this->name);
    }
}
class Wuser extends User
{
    function getName(){
        return strtolower($this->name);
    }
}

这样,您仍然可以使用多态性并重用一些常用代码。

它比接口更好,因为代码重用。您仍然可以为抽象类User使用接口,但我认为这将是矫枉过正。

最新更新