2017-01-26 5 views
1

나는이 클래스들을 가지고있다;JComponent까지 확장되는 클래스에서 상속받지 않는 클래스

public class Car extends JComponent { 

} 

public class Mazda extends Car { 

} 

public class Subaru extends Car { 
} 

내 차 클래스에서 나는 방법 페인트 구성 요소

@Override 
public void paintComponent(Graphics g) { 
    //why my planets aren't painted by this method 
    if (this instanceof Mazda) { 
     g.fillOval(0, 0, this.getWidth(), this.getHeight()); 
     System.out.println(this.getClass()); 
    } 
    if (this instanceof Subaru) { 
     g.setColor(Color.blue); 
     g.fillOval(0, 0, this.getWidth(), this.getHeight()); 
     System.out.println(this.getClass()); 
    } 
} 

그것은 잘 마쓰다의 인스턴스를 그립니다하지만, 스바루의 인스턴스에 대한 코드가 방금 전화 결코 극복을 우선합니다. Subaru가 Jcomponent를 Car에서 상속받지 못하는 것 같습니다. 또는 painComponent를 호출하지 않는 이유는 무엇입니까? 자바를 처음 접했을 때 나는 아마도 기본적인 것을 놓쳤을 것입니다.

+2

왜'Mazda'와'Subaru'에서'paintComponent'를 오버라이드하지 않습니까? –

+0

나는 마즈다 코드 만 노력했지만 스바루에서는 그렇지 않았다. 나는 자동차에서도 추상화를 시도했지만 운이 없었다. –

+0

인스턴스는 어떻게 추가됩니까? –

답변

0

수퍼 클래스에서 @Override 메서드를 사용하고 싶다면 Mazda 또는 Subaru,과 같은 기본 클래스에서 디자인 할 때 문제가 있다고 생각합니다. 특히 다른 동작을 지정하고 싶습니다. Car과 같은 추상 클래스에서는 MazdaSubaru에 공통적 인 방법 인 @Override 수 있으며, 수퍼 클래스의 하위에서는 중요하지 않습니다.

class Car extends JComponent{ 

} 

class Mazda extends Car{ 

    @Override 
    public void paintComponents(Graphics g) { 
    g.fillOval(0, 0, this.getWidth(), this.getHeight()); 
    System.out.println(this.getClass()); 
    } 
} 


class Subaru extends Car{ 

    @Override 
    public void paintComponents(Graphics g) { 
    g.setColor(Color.blue); 
    g.fillOval(0, 0, this.getWidth(), this.getHeight()); 
    System.out.println(this.getClass()); 
    } 

} 

다음 클래스를 생성 마즈다 Mazda mazda = new Mazda()을하고 메서드를 호출 : : mazda.paintComponent(... 또는 polimorphism를 사용 e.q.를 만들 그래서, 당신은이 같은이 구조를 쓸 수있을 것 같아요 Mazda은 다음과 같습니다 : Car mazda = new Mazda();

0

스바루 급은 분명히 Car에서 상속 받고 있지만 아마 전혀 표시되지 않을 것입니다. 거기에 대한 몇 가지 이유가 있지만 코드를 보지 않고 그냥 추측된다

  • 가 추가 부모가 아닌

    1. 스바루는 다른 인스턴스 (? 마즈다)에 의해 부모에게 추가, 또는 치환되지
    2. 스바루 해제 화면이 표시되고, 필요는
    3. 스바루 제로 차원과, 아무것도
    4. ...

    참고 페인트 없습니다 페인트 없습니다 : 각 서브 클래스가 전혀 instanceof를 사용하지 않고도 paintComponent의 자체 버전이있는 경우 Why not use instanceof operator in OOP design?

    그것은 더 OO 것 : instanceof의 사용은 종종 OOP 설계의 결함을 나타냅니다. 이렇게하는 한 가지 장점 : 새 자동차 모델을 추가하는 경우 Car 클래스를 변경할 필요가 없습니다.