Interface和Abstract的区别

04月19日 收藏 0 评论 1 java开发

Interface和Abstract的区别

转载声明:文章来源https://blog.csdn.net/sinat_34931550/article/details/80108799

1.对象接口(Interface)

使用接口(Interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的内容。
接口是通过Interface关键字来定义的,就像定义一个标准的类一样,但其中定义的所有方法都是空的。
接口中定义的所有方法都必须是公有的,这是接口的特性。

//定义一个缓存类接口
Interface Cache {
/**
*根据键获取缓存信息
*
*@param string $key
*@param mixed $default
*@return mixed
*/
public function get($key, $default=null);

/**
*添加缓存信息
*
*@param string $key
*@param mixed $value
*@param DateIime|int $minutes
*@return void
*/
public function put($key,$value,$minutes);
}

我声明一个Cache接口类,定义了两个方法get(),put()。那么实现此接口的所有类都必须实现这两个方法。实际上接口就是定义了一个标准,强制实现他的所有类都必须实现他所定义的方法。

//实现redis缓存
class Redis implements Cache {
public function get($key, $default=null){
//coding...
}
public function put($key,$value,$minutes){
//coding...
}
}
//实现file缓存
class File implements Cache {
public function get($key,$default=null){
//coding...
}
public function put($key,$value,$minutes){
//coding...
}
}

上面定义了两个缓存类,他们都实现了Cache接口。

class Test(){
private $cache;
function __construct($cache){
$this-cache = $cache;
}
public function write(){
$this->cache->set('name','liuyingjie');
}
}

$cache = new File();
$test = new Test($cache);
$test->write();

以上例子用的是文件缓存,假如某一天我突然想改用性能更好的redis,则直接把 $cache = new File() 改为 $cahce = new Redis() 而不用修改代码,因为他们的方法都是一样的。

2.抽象类(Abstract)

PHP 5 支持抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。

继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。此外方法的调用方式必须匹配,即类型和所需参数数量必须一致。例如,子类定义了一个可选参数,而父类抽象方法的声明里没有,则两者的声明并无冲突。 这也适用于 PHP 5.4 起的构造函数。在 PHP 5.4 之前的构造函数声明可以不一样的。

abstract class Animal
{
protected $name;
protected $food;

public function eat() {
echo '我是'.$this->name.',我爱吃'.$this->foot;
}
public function run() {
echo '我是'.$this->name.',我会跑.';
}
abstract public function call();
}

在上面我定义了一个抽象类Animal.它有两个属性$name,$food.两个非抽象方法,一个抽象方法,因为不同的动物他们的叫声不一样,所以这里我把call()抽象出来,交给子类去实现。class Dog extends Animal{

    public function __construct($name,$food){
$this->name = $name;
$this->food = $food;
}
public function call(){
echo "汪汪汪
";
}
public function swim(){
echo "我是{$this->name},我会游泳
";
}
}
class Cat extends Animal{
public function __construct($name,$food){
$this->name = $name;
$this->food = $food;
}
public function call(){
echo "喵喵喵!
";
}
public function climbTree(){
echo "我是{$this->name},我会上树
";
}
}

在这里,我定义了两个类,Dog , Cat. 猫和狗都会吃东西,都会叫。但据我了解,狗会游泳,不会爬树;猫不会游泳,但猫猫擅长爬树。

总结:

1.共同点
A.两者都是抽象类,都不能实例化
B.Interface实现类和abstract继承类都必须实现抽象方法

2.不同点
A.Interface需要实现,用implements;Abstract 需要继承,用exends
B.一个类可以实现多个Interface ;一个类只能继承一个Abstract
C.Interface强调功能的实现;Abstract强调从属关系
D.Interface的所有抽象类都只有声明没有方法体;Abstract抽象方法可以选择实现,也可以选择继续声明为抽象方法,无需实现,留给子类去实现
3.interface的应用场合
A. 类与类之间需要特定的接口进行协调,而不在乎其如何实现。

C 1条回复 评论
一盏课堂

写的不错 共勉~,最近也在开始写博客。大佬们来翻牌啊!

发表于 2023-01-10 21:00:00
0 0