객체 지향 프로그램은 클래스의 계층 구조를 통해 구축됩니다. PHP와 같은 단일 상속 언어에서 클래스 상속은 하나 이상의 하위 클래스를 가지며, 각 하위 클래스에서 하나 이상의 하위 클래스가 상속됩니다. . 더 많은 다음 단계 하위 카테고리. 물론, 다양한 기능을 구현하는 데 사용되는 여러 루트 클래스가 있을 수 있습니다. 잘 설계된 아키텍처에서는 각 루트 클래스에 애플리케이션 코드에서 사용할 수 있는 유용한 인터페이스가 있어야 합니다. 애플리케이션 코드가 루트 클래스와 작동하도록 설계된 경우 루트 클래스에서 상속되는 모든 하위 클래스에서도 작동할 수 있습니다.
추상 메서드는 하위 클래스의 일반 메서드에 대한 자리 표시자와 비슷하지만(공간을 차지하지만 효과가 없음) 일반 메서드와는 달리 코드가 없습니다. 클래스에 하나 이상의 추상 메서드가 있으면 해당 클래스는 추상 클래스가 됩니다. 추상 클래스를 인스턴스화할 수 없습니다. 추상 클래스를 상속한 다음 하위 클래스를 인스턴스화해야 합니다. 추상 클래스를 하위 클래스의 템플릿으로 생각할 수도 있습니다.
모든 추상 메서드를 재정의하면 하위 클래스는 일반 클래스가 됩니다. 모든 메서드가 재정의되지 않은 경우 하위 클래스는 여전히 추상입니다. 클래스에 추상 메서드가 포함되어 있으면(단 하나만 있더라도) class 키워드 앞에 abstract를 추가하여 클래스를 추상으로 선언해야 합니다.
추상 메서드 선언 구문은 일반 메서드 선언 구문과 다릅니다. 추상 메서드는 일반 메서드처럼 중괄호 {} 안에 본문이 포함되지 않고 세미콜론;으로 끝납니다.
예제 6.13에서는 getArea 메서드를 포함하는 Shape 클래스를 정의합니다. 하지만 모양을 모르면 도형의 면적을 가늠할 수 없기 때문에 getArea 메소드를 추상 메소드로 선언했습니다. Shape 개체를 인스턴스화할 수는 없지만, 예제 6.13에서처럼 이 개체에서 상속하거나 식에 사용할 수 있습니다.
추상 메서드만 사용하여 클래스를 만드는 경우 인터페이스를 정의합니다. 이러한 상황을 설명하기 위해 PHP에는 인터페이스가 있고 키워드를 구현합니다. 추상 클래스 대신 인터페이스를 사용하고 확장 대신 구현을 사용하여 클래스 정의를 설명하거나 인터페이스를 사용할 수 있습니다. 예를 들어 myClass 구현 myIterface를 작성할 수 있습니다.
/*메모:
두 가지 방법은 다음을 참조합니다.
1. 추상 클래스 aaa{}(aaa에는 추상 메서드만 있고 일반 메서드는 없음)
클래스 bbb는 aaa를 확장합니다{}(bbb의 aaa에 있는 추상 메서드를 재정의합니다).
2. 인터페이스 aaa{}
클래스 bbb는 aaa{}를 구현합니다(bbb의 aaa에 있는 추상 메서드 재정의).
*/
목록 6.13 추상 클래스
//추상 루트 클래스 추상 루트 클래스
추상 클래스 모양
{
추상 함수 getArea(); //추상 메소드 정의
}
//추상 자식 클래스 추상 서브클래스
추상 클래스 Polygon은 Shape //Polygon을 확장합니다.
{
추상 함수 getNumberOfSides();
}
//구체 클래스 엔터티 클래스 삼각형 클래스
클래스 Triangle은 다각형을 확장합니다.
{
공개 $base;
public $height;
public function getArea() //면적 계산 방법 재정의{
return(($this->base * $this->height)/2);
}
공개 함수 getNumberOfSides() //사이드 카운트 메서드 재정의{
반환(3);
}
}
//구체적인 클래스 엔터티 클래스 사각형
클래스 Rectangle은 Polygon을 확장합니다.
{
공개 $ 너비;
공개 $ 높이;
공개 함수 getArea()
{
return($this->너비 * $this->높이);
}
공개 함수 getNumberOfSides()
{
반환(4);
}
}
//구체적인 클래스 엔터티 클래스 서클
클래스 Circle은 Shape를 확장합니다.
{
공개 $반경;
공개 함수 getArea()
{
return(pi() * $this->radius * $this->radius);
}
}
//구체적인 루트 클래스는 색상 클래스를 정의합니다.
클래스색상
{
공개 $이름;
}
$myCollection = array(); //모양 컬렉션을 만들고 배열에 넣습니다.
//사각형을 만듭니다.
$r = 새로운 직사각형;
$r->너비 = 5;
$r->높이 = 7;
$myCollection[] = $r;
unset($r);
//삼각형 만들기
$t = 새로운 삼각형;
$t->기본 = 4;
$t->높이 = 5;
$myCollection[] = $t;
unset($t);
//원을 만듭니다.
$c = 새로운 서클;
$c->반경 = 3;
$myCollection[] = $c;
unset($c);
//색상 만들기
$c = 새로운 색상;
$c->이름 = "파란색";
$myCollection[] = $c;
unset($c);
foreach($myCollection을 $s로)
{
if($s instanceof Shape) //$s가 Shape 클래스의 인스턴스인 경우{
print("영역: " . $s->getArea() . "n");
}
if($s 인스턴스의 다각형)
{
print("측면: " .$s->getNumberOfSides()."n");
}
if($s 인스턴스의 색상)
{
print("색상: $s->이름 n");
}
인쇄("n");
}
?>