2016-06-26 3 views
1

У меня есть код нижеабстрактный класс в PHP

/*abstract*/ class Animal{ 
    protected $name; 
    protected $legs; 

    public function setName($name){ 
     $this->name = $name; 
    } 

    public function getName(){ 
     return $this->name; 
    } 

    // abstract public function sound(); 
} 


class Cat extends Animal{ 
    public function sound(){ 
     echo 'Meo meo meo'; 
    } 
} 

class Crocodile extends Animal{ 
    public function sound(){ 
     echo 'Never hear it'; 
    } 
} 

function check(Animal $a){ 
    echo $a->getName();br(); 
    echo $a->sound();br(); 
} 

$cat = new Cat(); 
$cat->setName("Cat"); 

$cro = new Crocodile(); 
$cro->setName('Nothing'); 


class test{ 
    public function check(Animal $a){ 
     echo $a->getName(); 
     echo $a->sound(); 
    } 
} 


$t = new test();  
$t->check($cro);  

Я думаю, если не использовать абстрактные поэтому последняя строка $ t-> чек ($ CRO) должны неправильно, но почему он работать хорошо. Я хочу задать вопрос, в классе тест с методом проверки, $ a-> sound(); в Animal нет, но он все еще работает. Он работает, как при открытии абстрактного класса комментариев, и то и другое не отличается. Я действительно удивляюсь, может быть, я ошибался, понимал эту проблему, скрутил

+0

Метод 'sound' существует в классе' Крокодил'. Вот почему он работает. –

+0

, но нет у животных, а параметр с Animal – KIM

+0

Вы запускаете метод проверки объекта класса «Крокодил». Этот объект имеет «звуковой» метод. Не имеет значения, имеет ли этот метод «Animal» этот метод или нет, если метод существует в дочернем классе. –

ответ

1

Мы говорим о животных и конкретных животных, таких как кошки и крокодилы. Хотя в вашем определении понятие животного не связано с методом звука, конкретные животные, такие как кошки и крокодилы, которые унаследованы от животных, обладают способностью звука. Так вы получаете от более общего к более конкретному. В конце вы получите больше особенностей.

Ваш Animalclass имеет protected$name элемент вместе с геттер и сеттер. Они полезны, поскольку вам не придется переопределять их для Crocodile или Cat. Но вы могли бы рассказать class, что вы не знаете, как будет выглядеть метод sound, но вы знаете, что все Animals могут сделать sound. Вот почему class - abstract: вы можете реализовать его часть, но некоторые вещи не могут быть реализованы на уровне Animal, так как разные типы животных будут иметь разные типы звука.

+0

Я понимаю вас, но сеттер и геттер означают? ? – KIM

+0

@KIM, это просто имена функций, которые устанавливают или получают значения. Например, установщиком имени является setName, а getter name - getName –

Смежные вопросы