0

这样做有什么区别:

class UserRepository extends DAO
{
    public function GetAllUsers()
    {
        return $this->Select();
    }

    public function GetUserById( $id )
    {
        return $this->Select( $id );    
    }
}

class MockUserRepository extends MockDAO
{
    public function GetAllUsers()
    {
        return $this->Select();
    }

    public function GetUserById( $id )
    {
        return $this->Select( $id );    
    }
}

class UserController
{
    private $userRepository;

    function __Construct( $repo )
    {
        $this->userRepository = $repo;
    }

    public function ListUsers()
    {
        $users = $this->userRepository->AnUndeclaredMethod();
        // ...
    }
}

$repo = new MockUserRepository();
$controller = new UserController( $repo );

和这个:

interface IUserRepository
{
    public function GetAllUsers();
    public function GetUserById( $id );
}

class UserRepository extends DAO implements IUserRepository
{
    public function GetAllUsers()
    {
        return $this->Select();
    }

    public function GetUserById( $id )
    {
        return $this->Select( $id );    
    }
}

class MockUserRepository extends MockDAO implements IUserRepository
{
    public function GetAllUsers()
    {
        return $this->SelectUsers();
    }

    public function GetUserById( $id )
    {
        return $this->SelectUsers( $id );            
    }
}

class UserController
{
    private $userRepository;

    public function __Construct( IUserRepository $repo )
    {
        $this->userRepository = $repo;
    }

    public function ListUsers()
    {
        $users = $this->userRepository->AnUndeclaredMethod();
        // ...
    }
}
$repo = new MockUserRepository();
$controller = new UserController( $repo );

如果在控制器中使用了一个未在其中一个存储库中声明的函数,它无论如何都会抛出错误,为什么对这种类型的任务使用接口更好?我有什么好处?

  1. 都是关于错误的吗?如果您忘记实现一个您知道必须存在的功能,无论是否使用它都会出错,这是接口的好处吗?
  2. 是不是因为您可能需要 2 个存储库用于 2 个数据源,所以如果您的控制器调用未实现的功能而不是立即提醒您您的存储库之一,您的应用程序将停止工作没有实现您在界面中告诉它的方法?再一次,这都是关于错误的吗?
4

1 回答 1

0

接口强制使用该接口的任何对象,使接口内的方法可调用,也称为实现。因此,如果您有两个使用相同接口的不同类,它们都必须具有相同的方法(例如 save())。尽管每个类都必须有一个保存方法,但方法中的代码可以完全不同,重点是每个类都有一个save()方法。

我见过与工厂一起使用的接口,这些接口可能会创建各种对象。因此调用代码使用各种参数调用工厂,返回一个对象,并且由于工厂内创建的对象遵循接口,我们可以安全地调用save()而不知道实际创建的是哪个对象。

于 2013-09-18T01:05:45.753 回答