为什么在下面的条件下使用接口而不是 class。
why used to interface rather than class in below condition.
我想显示一个 name.name 可能是大写或小写,这将取决于 class 我将 pass.i 必须接近一个正在使用 class
第二个是 interface
哪个更好,为什么?
解决方案使用Class
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();
使用界面的解决方案
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();
我会使用 classes,因为您可以重用一些代码。
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);
}
}
这样您仍然可以使用多态性并重用一些通用代码。
它比接口更好,因为代码重用。您仍然可以为抽象 class User 使用接口,但我认为这会有点矫枉过正。
使用接口解决方案 getName() 方法已定义但未在 用户界面 中实现(未在您的代码中显示),所以每个 class 实现它都必须定义获取名称的行为,而使用抽象 classes 你可以定义获取名称的标准方法,并覆盖或重载子 [=28 中的方法=]必要时。
所以对于你的代码,我认为最好的解决方案是抽象。
当您想要强制开发人员编写 getName() 方法的代码时,请记住使用接口,而抽象 classes 只是为了允许开发人员使用父方法 getName() 或 override/overload(如有必要)。接口为您提供更多控制和代码重用。
查看PHP object interfaces doc and PHP class abstraction doc,它可能会为您的疑惑提供一些线索。
我想显示一个 name.name 可能是大写或小写,这将取决于 class 我将 pass.i 必须接近一个正在使用 class
第二个是 interface
哪个更好,为什么?
解决方案使用Class
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();
使用界面的解决方案
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();
我会使用 classes,因为您可以重用一些代码。
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);
}
}
这样您仍然可以使用多态性并重用一些通用代码。
它比接口更好,因为代码重用。您仍然可以为抽象 class User 使用接口,但我认为这会有点矫枉过正。
使用接口解决方案 getName() 方法已定义但未在 用户界面 中实现(未在您的代码中显示),所以每个 class 实现它都必须定义获取名称的行为,而使用抽象 classes 你可以定义获取名称的标准方法,并覆盖或重载子 [=28 中的方法=]必要时。
所以对于你的代码,我认为最好的解决方案是抽象。
当您想要强制开发人员编写 getName() 方法的代码时,请记住使用接口,而抽象 classes 只是为了允许开发人员使用父方法 getName() 或 override/overload(如有必要)。接口为您提供更多控制和代码重用。
查看PHP object interfaces doc and PHP class abstraction doc,它可能会为您的疑惑提供一些线索。