私は SO や Web の残りの部分で良い答えを探しましたが、本当に理解できる答えは見つかりませんでした。私はこれを別の方法で提示するつもりです。そして、その答えが他の人にも役立つことを願っています。
私の理解する限り、抽象クラスはメソッド実装機能により柔軟性が高いという点を除けば、2 つの概念は同じルールを持っています。また、複数のインターフェースを実装して 1 つのクラスのみを拡張できることも承知していますが、私が挙げた 2 つ以外にも違いがあるはずです。
2 つのコード スニペットを見て、それぞれの例で何ができるか、また、もう一方を使用したくなるか、使用したくないかの例を教えてください。
抽象クラス
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) {
}
}
ベストアンサー1
抽象的な
抽象クラスは、ある種の物事の類似性に焦点を当てます。
人々は タイプ であると見なされ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();