这样做之间的区别是什么:
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 );
如果在控制器中使用了一个未在其中一个存储库中声明的函数,那么无论如何都会抛出一个错误,为什么在这种类型的任务中使用接口会更好?我从中受益匪浅?
答案 0 :(得分:0)
接口强制使用接口的任何对象在接口中创建可调用的方法,也称为实现。因此,如果您有两个使用相同接口的不同类,则它们必须具有相同的方法(例如save())。尽管每个类都必须有一个save方法,但方法中的代码可能完全不同,重要的是每个类都有一个save()
方法。
我见过与工厂一起使用的接口可能会创建各种对象。因此调用代码调用具有各种参数的工厂,返回一个对象,并且因为工厂内创建的对象粘附到接口,我们可以安全地调用save()
而不知道实际创建了哪个对象