2013-06-01 2 views
0

생각해 보았습니다. OOP에서는 괜찮 았지만 걸림돌이 된 것 같습니다.부모 개체와 자식 개체를 OOP에서 개별적으로 호출

이 예에서는 Car 및 BMW와 Audi가 있습니다. 자동차에는 일련의 행동이 있으며 BMW와 Audi는 자동차에서 따로 상속됩니다.

 
---Car--- 
| ----- | 
---------- 
BMW --- Audi 

사용자가 개체를 만들면 new BMW와 같은 하위 클래스를 통해이 작업을 수행합니다. BMW는 이러한 속성을 검색하고 저장하는 데있어 다른 속성과 방법을 가지고 있기 때문에 괜찮습니다. 그러나 다음 화면에서 Car (BMW 또는 Audi 일 수 있음)를 표시하고자하므로 본질적으로 여기서 Car-> getName()을 수행하고 싶습니다. BMW의 이름이 Audi의 이름과 다르게 저장된다는 것을 염두에 두십시오. 이것을 어떻게 성취합니까? 나는 좋은 사례라고 생각하지 않기 때문에 이것을 정말로하고 싶지는 않지만 진술을 사용할 수있다. 어떤 아이디어?

+0

'carInstance.getName()'? –

+0

@Keyser 정확히 이유는 없지만 Audi는 오디오 테이블에 저장되고 BMW는 BMW 테이블에 저장됩니다. 끔찍한 구조처럼 들리지만, 이런 방식으로 많은 일을하지 않아도됩니다! – Dogday

답변

1

getName()을 추상화해야합니다. Car을 인스턴스화 할 수 없도록 추상 클래스로 만듭니다. 그런 다음 AudiBMW 하위 클래스에서 getName() 메서드를 재정의하여 올바르게 이름을 반환하십시오.

이것은 모두 자바라고 가정하고 있지만 PHP에는 비슷한 OOP 개념이 있습니다.

편집 : 공장이 필요할 수 있습니다. 먼저 자동차를 추상화하십시오. 그런 다음이 메소드를 어딘가에 배치하십시오 (예 : 자동차의 정적 메소드).

public Car carFactory(DB database) { 
    if (DB.shouldMakeAudi()) { 
     return new Audi(); 
    } else if (DB.shouldMakeBMW()) { 
     return new BMW(); 
    } else { 
     return null; 
    } 
} 
+0

이것은 내가 상상했던 방식이지만, 내가 차를 표시하고있는 페이지에서 BMW인지 또는 아우디인지는 모르므로 Car 클래스를 호출하여 추상이 될 수 없도록해야합니다. – Dogday

+0

당신이 무슨 뜻인지 이해가 안되요.왜 자동차의 종류를 알아야합니까? 자동차 인 경우 자동차의 메소드를 호출 할 수 있습니다. – GJK

+0

사실이지만 getName 메서드는 BMW와 Audi와는 다릅니다 – Dogday

0

잘 CAR 클래스는 메소드 getName(); 클래스 속성 $ _carName에 값을 설정합니다.

class car { 
protected $_carName; 

protected function getCarName(){ 
    return $this->_carName; 
} 
} 

그래서 지금은 $ _carName에 자식 클래스 안에 setter 함수를 설정합니다. 그리고 carname을 가져오고 싶을 때마다 각 자식 classInstance를 사용하여 각각의 carname을 얻을 수 있습니다. 당신의 BMW와 아우디는 자동차를 상속하자

public abstract class Car { 

    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 

을, 여기에 어떤 BMW와 아우디 특정 이름을 포함 :

+0

'return $ this -> _carName; ' – moonwave99

0

이 같은, 당신의 자동차 클래스를 가질 수

public class BMW extends Car { 

    private String bmwSpecificName; 

} 

public class Audi extends Car { 

    private String AudiSpecificName; 

} 
-2

당신이 말한대로 그것은 나쁜 습관이지만 만약 당신이 정말로 그것을하고 싶다면 그렇게 할 수있다. (Java 용) :

+0

하지만 지구상에 공통 조상이있는 이유는 무엇입니까? – moonwave99

+0

당신은 절대적으로 옳습니다. 하지만 그는 abstract 클래스 Car에서 getName() 메서드를 재정의하거나 슈퍼 클래스의 공통 필드에 저장하지 않고이 작업을 수행하기를 원한다고 생각했습니다. 그러나 그가 공통 분야를 갖지 않는 경우에만이 비 OOP 방식을 제안하는 것에 대해 사과드립니다. – QI3it

+2

죄송하지만, 전 세계에서이 작업을 수행 할 절대 이유가 없습니다. 그리고 당신이 이유를 생각할 수 있다면 그것은 단지 당신의 수업 설계가 끔찍하기 때문입니다. 이와 같은 일을하는 경우, 코드를 삭제하고 다시 시작하십시오. – GJK

0

당신은 추상적 인 클래스의 자동차, 오디오 및 BMW 있습니다. 설명을 위해 단순화되었습니다. 객체의 이름을 추출하려면 getName을 호출하기 만하면됩니다. 이 예에서는 이름이 BMW 또는 오디오에 의해 내부적으로 저장되는 방법과는 상관이 없습니다. 정적 유형 Car (실제 유형으로 BMW 또는 Audio 중 하나 일 수 있음) 객체를 가져오고 getName()으로 호출하면됩니다.

<?php 

abstract class Car { 
    /** 
    * Returns the name of the car. 
    * @return string 
    */ 
    abstract function getName(); 
} 

class BMW extends Car { 
    public function getName() { 
     return 'bmw'; 
    } 
} 

class Audio extends Car { 
    public function getName() { 
     return 'audio'; 
    } 
} 
관련 문제