找遍了周围的SO以及网络的一个很好的答案的其余部分,但我发现have't一个,我真的明白了。 我会以不同的方式和希望的答案将帮助其他人也提出这一点。
据我了解,这两个概念有相同的规则,只是一个抽象类更灵活,由于方法的实现能力。 另外,我知道你可以实现多个接口,只扩展一个类,但我敢肯定有比我提到的两个差异。
请看看代码两个片段,并给我一个例子我可以用我的每一个例子都将让我想或不想使用其他的事情。
抽象类
abstract class Foo {
abstract public function getValue();
abstract public function setValue($value);
}
class myObj extends Foo {
function getValue() {
}
function setValue($value) {
}
}
接口
interface Foo {
public function getValue();
public function setValue($value);
}
class myObj implements Foo {
function getValue() {
}
function setValue($value) {
}
}
要恢复的想法(全球范围内,不详细):
inheritance
是概念extend from something
,还可以选择添加一些新的功能,或覆盖现有的特征(做不同)。 但是,使用继承,你共享与父代码的重要组成部分。 你是父母+其他一些东西。
interface
代表着一些能力(我们说一个类实现一个接口来表示,它具有这些能力)。 一个接口可以通过2类,这是完全不同的,并且不共享它们的代码(除它们的方法实现)来实现。 当A和B被实现接口C,A不是B和B不是A.
而针对这个理由的一个interface
确实允许程序员做,因为他们可以用多继承做同样的,但没有多继承的问题。
这一概念是在像JAVA,PHP的一些编程语言中使用...
抽象
抽象类专注于一种事物的相似性。
人们认为类型的mammal
,因此不会被视为类型的vehicle
。
接口
接口集中在类似功能的排序规则。
例如:你是一个人,并类型的mammal
。 如果你要飞,那么你将需要执行一个flying Interface
。 如果你想拍摄而飞,那么你还需要实现的gun Interface
。
看下面的例子:
abstract class Mammal {
protected $age_;
//below are functions I think all mammals will have,including people
abstract public function setAge($age);
abstract public function getAge();
abstract public function eat($food);
}
class Person extends Mammal {
protected $job_; //Person's feature
public function setAge($age){
$this->age_ = $age;
}
public function getAge(){
return $this->age_;
}
public function eat($food){
echo 'I eat ' ,$food ,'today';
}
//People only attribute
public function setJob($job){
$this->job_ = $job;
}
public function getJob(){
echo 'My job is ' , $this->job_;
}
}
//Now a person wants to fly, but they are typically not able to do so.
//So we implement an interface
interface Plane{
public function Fly();
}
//I also want shoot enemy
interface Gun{
public function shoot();
}
class Person2 extends Mammal implements Plane,Gun{
protected $job_;//Person feature
public function setAge($age){
$this->age_ = $age;
}
public function getAge(){
return $this->age_;
}
public function eat($food){
echo '<br/>I eat ' ,$food ,' today<br/>';
}
//Only a person has this feature.
public function setJob($job){
$this->job_ = $job;
}
public function getJob(){
echo 'My job is ' , $this->job_;
}
//-----------------------------------------
//below implementations from interfaces function. (features that humans do not have).
//Person implements from other class
public function fly(){
echo '<br/>I use plane,so I can fly<br/>';
}
public function shoot(){
echo 'I use gun,so I can shoot<br/>';
}
}
$People = new Person();
echo '<pre>';
print_r( get_class_methods('People'));
echo '</pre>';
echo '<pre>';
print_r( get_class_methods('People2'));
echo '</pre>';
$People2 = new Person2();
$People2->setAge(24);
echo $People2->getAge();
$People2->eat('egg');
$People2->setJob('PHP devepop');
echo $People2->getJob();
$People2->fly();
$People2->shoot();
简要地说, 接口是标准化的一组函数,而抽象类是定义一个基本骨架的类从派生。
我以前也想过这个,我可以得出结论:最好的是, 接口是一个纯粹的抽象类 (C ++) 的逻辑抽象方便 。
至于为什么你会选择在抽象类的接口,我引用( 一个C ++源代码 ,但概念是相同的):
请注意,有一个很大的诱惑,具体成员函数和数据添加到纯抽象基类。 这必须予以抵制,一般来说它是接口没有很好因素的标志。 数据和混凝土构件的功能趋向于暗示特定实施,因此可以从接口继承但不应该是该接口。 相反,如果有具体的类之间有一些共性,其从纯粹的抽象类继承了它的接口,并限定具体的类的公共数据和成员函数抽象类的创建效果很好。
问题是,使用接口时,想到的第一件事就是去耦 。 当使用的接口,该用户和执行级是完全去耦。 这同样适用于当您使用的是纯抽象类 ,它基本上是一个接口。
文章来源: Abstract Class vs. Interface [duplicate]