功能层和接口之间的区别

时间:2013-09-18 00:48:15

标签: php interface

这样做之间的区别是什么:

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个存储库,因此如果您的控制器调用未实现的功能而不是立即通知您的应用程序,则不知道您的应用程序将停止工作您的存储库没有实现您在界面中告诉它的方法?再一次,是关于错误的吗?

1 个答案:

答案 0 :(得分:0)

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

我见过与工厂一起使用的接口可能会创建各种对象。因此调用代码调用具有各种参数的工厂,返回一个对象,并且因为工厂内创建的对象粘附到接口,我们可以安全地调用save()而不知道实际创建了哪个对象