这样做有什么区别:
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 );
如果在控制器中使用了一个未在其中一个存储库中声明的函数,它无论如何都会抛出错误,为什么对这种类型的任务使用接口更好?我有什么好处?
- 都是关于错误的吗?如果您忘记实现一个您知道必须存在的功能,无论是否使用它都会出错,这是接口的好处吗?
- 是不是因为您可能需要 2 个存储库用于 2 个数据源,所以如果您的控制器调用未实现的功能而不是立即提醒您您的存储库之一,您的应用程序将停止工作没有实现您在界面中告诉它的方法?再一次,这都是关于错误的吗?