2013-10-09 3 views
2

지지 않도록이 코드를 가지고 : 추상 방법/

public interface Position { 
    public int getX(); 
    public int setX(int x); 
    public int getY(); 
    public int setY(int y); 
} 

public StandardPosition implements Position { 
    // STANDARD implementation of Position here 
} 

public abstract class Mover { 
    public abstract Position move (Position originalPosition); 
} 

A "무버는"최종 위치로 초기 위치에서 뭔가를 이동 무언가이다.

이제 흥미로운 부분이 있습니다. 일부 발동기는 좀 더 복잡하고 더 복잡한 위치 개체로 작업합니다.

public class ComplicatedPosition extends StandardPosition { 
// ADDS Y DIMENSION 
private int y; 
public int getY() { return(y); } 
public void setY(int y) { this.y = y ; } 
} 


public class MoreComplicatedMover extends Mover { 

    @Override 
    public void Position move(Position initialPosition) { 
    ComplicatedPosition q = (ComplicatedPosition) initialPosition; 
    // Do a transformation and 
    // return a new position 
    return(q); 
    } 

} 

내 질문은 여기에 ... ComplicatedPosition의 위치에서지지 않도록 할 수있는 방법이 ... ... 또 다른 방법 (우리는 클래스 인터페이스에서 캐스팅 .. 어색 조금 보인다) 이 질문을하는 방법은 :이 코드를 설정하는 다른 방법이 있습니까? 건배! 당신이 할 수

+0

일부 코드 예제를 명확히해야합니다. Position.setX() 및 Position.setY()에 인수가 없습니까? CompleicatedPosition이 클래스 또는 인터페이스입니까? 인터페이스 만 다른 인터페이스를 확장 할 수 있지만 예제에 표시된 것처럼 인터페이스에는 구현이 포함될 수 없습니다. – Dev

+0

감사합니다 @Dev 방금 편집했습니다 ;-) – MadSeb

답변

3

그런데 한 가지처럼 사용 제네릭입니다 : 이것은 당신이 원하는해야하는지 경우 잘 모르겠어요 그러나

public abstract class Mover<T extends Position> { 
    public abstract T move(T originalPosition); 
} 

public class ComplicatedMover extends Mover<ComplicatedPosition> { 
    public ComplicatedPosition move(ComplicatedPosition p) { 
    //do stuff 
    } 
} 

.

btw; Mover이 (가) 새로운 Position을 제공하거나 주어진 Position을 변경하겠습니까? 개인적으로 주어진 위치를 변경하는 경우 개인적으로 void 메소드로 변경합니다.

+0

나를 이길 ... +1 –

+0

주셔서 감사합니다 .. 명확히하기 : 발동기는 새로운 위치를 부여하기로되어 있습니다 .-) – MadSeb

+0

@MadSeb 아 좋아, 내가 던져 버렸어. 당신의'ComplicatedMover'가 q를 다시 돌려주기 때문에;) – Alowaniak

0

ComplicatedPosition에 대한 API가 StandardPosition과 다른 경우 (이것이 내가 캐스팅하는 이유라고 가정 함) Position 인터페이스를 업데이트하고 거기에 필요한 모든 API를 넣습니다. 그런 다음, 첫 번째 방법은 StandardPosition에서 그 여분의 방법을 구현하고 간단히 한 더 나은 방법이 어댑터 패턴을 구현하고 모든 추가 메소드를 구현 PositionAdapter 같은 추상 클래스를 가지고있다

throw new UnsupportedOperationException(""); 

퍼팅과 UnsupportedOperationException을 던져 것

public class StandardPosition extends PositionAdapter { 
} 

당신이 당신의 StandardPosition 또는 기타 구현하는 클래스에없는 필요한 방법의 무리를 구현할 필요가 없습니다 이쪽으로. 그러면 주물을 제거하고 인터페이스의 모든 메소드를 호출 할 수 있습니다. 희망이 도움이됩니다.

관련 문제