2013-10-09 122 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()应该没有参数吗? ComplicatedPosition是类还是接口?只有接口可以扩展其他接口,但接口无法实现,如示例中所示。 – 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应该给一个新的位置或改变给定的位置? 就个人而言,如果您正在更改给定的职位,我会将其作为void方法。

+0

击败我吧... +1 –

+0

谢谢..澄清:移动应该给一个新的位置;-) – MadSeb

+0

@MadSeb啊好吧,我被抛出因为你的'ComplicatedMover'再次返回q;) – Alowaniak

0

如果ComplicatedPosition的API不同于StandardPosition(我认为它是,那就是你正在投射的原因),更新你的接口并将所有需要的API放在那里。然后,第一种方法是实现在StandardPosition这些额外的方法,干脆把

throw new UnsupportedOperationException(""); 

更好的办法是实现适配器模式,并有一个抽象类,像PositionAdapter它实现了所有这些额外的方法和投UnsupportedOperationException,然后让

public class StandardPosition extends PositionAdapter { 
} 

这样你就不必实现您的StandardPosition或任何其他实现类一堆不需要的方法。然后你可以摆脱你的铸件并在界面上调用所有方法。 希望这有助于。