개발! 딱 깔끔하고 센스있게!

PHP 예제를 사용한 일반적인 다형성 본문

개발 스크랩 메모/PHP

PHP 예제를 사용한 일반적인 다형성

렉사이 2020. 11. 21. 23:54

개만'되찾기'를 할 수 있기 때문이다.

이 예는 좋은 생각이냐 나쁜 생각이냐?인스타뉴스의 사용으로 인해, 이것은 매우 엉망진창이라는 생각이 들었지만, 나는 왜 그런지 전혀 확실치 않다.

class Animal { var $name; function __construct($name) { $this->name = $name; } } class Dog extends Animal { function speak() { return "Woof, woof!"; } function playFetch() { return 'getting the stick'; } } class Cat extends Animal { function speak() { return "Meow..."; } } $animals = array(new Dog('Skip'), new Cat('Snowball')); foreach($animals as $animal) { print $animal->name . " says: " . $animal->speak() . '
'; if ($animal instanceof Dog) echo $animal->playFetch(); }

다른 예.내가 id 의 데이터 대상을 계속 생성할 때, 나는 기본적으로 그것들을 확장하고, 코드 반복을 피하는 것이 가장 좋다.

또, 이게 엉망진창이지?의자에 이름이 없어서 개도 바퀴가 없다.

그러나 데이터의 대상이기 때문에 헷갈리기 쉽다.

class Data_Object { protected $_id; function setId($id) { $this->_id = $id; } function getId() { return $this->_id; } } class Dog extends Data_Object { protected $_name; function setName($name) { $this->_name = } function getName() { return $this->_name; } } class Chair extends Data_Object { protected $_numberOfWheels; function setNumberOfWheels($number) { $this->_numberOfWheels = $number; } function getNumberOfWheels() { return $this->_numberOfWheels; } } 

본질적으로는 내가 묻는 것은 ‘모든 자류가 같은 인터페이스를 가지고 있는 것일까 아니면 다른 인터페이스를 가질 수 있을까?’라고 생각한다.

대답

이런 상황에서 토론 인터페이스는 매우 유용하다.

interface Talkative { public function speak(); } class Dog extends Animal implements Talkative { public function speak() { return "Woof, woof!"; } } 

건담 계면의 동물이나 인간(또는 외계인)이 필요한 환경에서 사용할 수 있다.

protected function makeItSpeak(Talkative $being) { echo $being->speak(); } 

이것은 올바른 다태 방법이다.

너는 네가 무엇을 처리하는 것에 신경 쓰지 않고, 그것만 말할 수 있다면.

개도 물건을 잡는 게임을 할 수 있다면 그것에 아주 좋다.

만약 네가 이 점을 개괄하려면 인터페이스 차원에서 고려할 수 있다.

언젠가는 훈련된 고양이 한 마리를 얻게 될 수도 있고, 그것도 놀 수도 있다.

class Cog extends Cat implements Playfulness { public function playFetch() { ... } } 

이것은 당신이 그 동물과 fetch 를 호출하고 싶다는 점이다.

PlayFetch 라고 하지 않는 게...너는 할 수 있지만, 너는 이 순간에 공을 치고 싶기 때문이다.

만약 네가 놀고 싶지 않다면 그것을 부르지 않을 것이다.

만약 당신이 특정 상황에서 놀 필요가 있다면, 당신은 가지고 갈 수 있는 물건을 필요로 합니다.

당신은 인터페이스를 통해 이 점을 확보할 수 있습니다.

사용류 상속도 같은 기능을 실현할 수 있고, 유연성이 떨어질 뿐이다.

어떤 상황에서 강성 차원이 존재하지만, 그것은 매우 유용하다.

abstract class Animal { } abstract class Pet extends Animal { } class Dog extends Pet { public function playFetch() { ... } } class GermanShepherd extends Dog { public function beAwesome() { ... } } 

그리고 몇몇 특정한 윗부분에서 어떤 동작을 실행할 수 있는 대상이 필요할 수도 있지만, Germanshepherd 를 특별히 찾아야 경외할 수 있기 때문입니다.

protected function awesomeness(GermanShepherd $dog) { $dog->beAwesome(); } 

이 길에서 당신은 새로운 품종의 독일 목양견을 만들어 낼 수도 있지만, 독일 목양견의 종류를 확장할 수도 있다.

그것들은 여전히 awesomeness 함수를 사용하여 인터페이스를 사용하는 것처럼 사용된다.

너는 물론 무작위 에서 순환 을 점검하고, 그것들이 무엇인지 점검해 자신의 일을 하도록 해야 한다.

이것은 어떤 상황에서도 현명하지 않다.

Comments