초기 생각은 상속에 좋지 않을 수도 있지만 테스트 후에는 괜찮아 보입니다. 그러나, 당신이 알고있을 수있는 다른 방법이 있습니다.
추상 클래스 또는 인터페이스가 적합 할 수 있습니다.
추상 클래스는 다른 클래스와 같지만 인스턴스화 할 수 없습니다. 구체적인 클래스에 의해 구현되어야하는 추상 메소드가 있습니다.
abstract class A {
//You can also have abstract methods
abstract public function doFoo();
abstract public function doBar($when);
//Also implemented method which when
//called unless overridden will use this logic
public function sayHi(){
echo "hi";
}
}
이제이 클래스는 추상 메소드를 구현하거나이 메소드가 필요로하는 추가 로직을 추가하지 않도록 선택할 수 있습니다.
abstract class B extends A {
public function doFoo(){
//Some code
}
abstract public function doFooBar();
public function sayBye(){
echo "bye";
}
}
이것은 구현 된 클래스가 아직 재정의 될 수없는 경우 모든 구체적인 메소드를 여기에 구현해야합니다.
인터페이스는 간단하고 비싼 방법은 방법 모음입니다. 당신은 단순히 개발자에게 이것이 이것을 구현할 것인지를 말하고 있습니다. 이 메소드는 추상으로 선언되지 않지만 인터페이스에서 구현 될 수는 없습니다.
interface iA {
public function doFoo();
public function doBar();
}
인터페이스 단지 인터페이스
interface iB extends iA {
public function doFooBar();
}
interface iC {
public function doAnything();
}
더 방법을 첨가
class A implements iA{
public function doFoo(){
//Some Code
}
public function doBar(){
//Some Code
}
}
class B implements iB{
public function doFoo(){
//Some Code
}
public function doBar(){
//Some Code
}
public function doFooBar(){
//Some Code
}
}
(가) 인터페이스의 장점을 추가 클래스에 의해 구현되는 다른 인터페이스에 의해 확장 될 수는 있다는 클래스 또는 초록은 그 이상을 구현할 수있다.
abstract class C implements iA, iC {
public function doFoo(){
//Some Code
}
}
class D extends C {
//get doFoo() from C implementation and must implement the remaining...
public function doBar(){
//Some Code
}
public function doAnything(){
//Some Code
}
}
나에게 잘 들렸지 만 예제는 매우 좁습니다. –
더 깊이 중첩 된 (읽기 : 비현실적인) 상속에 도달하거나 클래스의 내용이 극도로 복잡하지 않으면 성능에 영향을 미치지 않을 것입니다. 응용 프로그램의 디자인에서 상속 수준이 20 단계가되도록 요구하는 경우에도 그렇습니다. 필요에 따라 유지 보수성/가독성과 성능 사이의 절충점이 될 수 있습니다. –
누가 나쁜 습관이라고 말합니까? (일부 자료를 연결할 수 있습니까?) –