Inheritance 如何在接口中实现getter/setter?

Inheritance 如何在接口中实现getter/setter?,inheritance,interface,Inheritance,Interface,我正在做一个国际象棋游戏,我有一个基本的“棋子”界面,我希望所有棋子都能实现。我有一些每个类都需要的通用变量,但我不想在每个类中都使用getter和setter(似乎它与DRY相反) 我所做的是将我的接口称为PieceBase,有一个具体的类称为Piece,我将我的实际片段从Piece扩展到实现PieceBase。但我不希望这个片段被实例化,因为它本身没有意义,而且这个方法的某些方面让我感到不安 这通常是如何做到的 具体来说,这是在Java中实现的,但我不知道它在任何其他OO语言中是否有所不同。

我正在做一个国际象棋游戏,我有一个基本的“棋子”界面,我希望所有棋子都能实现。我有一些每个类都需要的通用变量,但我不想在每个类中都使用getter和setter(似乎它与DRY相反)

我所做的是将我的接口称为PieceBase,有一个具体的类称为Piece,我将我的实际片段从Piece扩展到实现PieceBase。但我不希望这个片段被实例化,因为它本身没有意义,而且这个方法的某些方面让我感到不安

这通常是如何做到的


具体来说,这是在Java中实现的,但我不知道它在任何其他OO语言中是否有所不同。

您想要扩展Piece并实现PieceBase,这似乎很奇怪。。。但也许我没看到什么。如果使用了接口,那么实现它的所有类仍然必须定义自己的getter/setter

用抽象类来代替似乎是有意义的


这样,他们都使用相同的getter/setter。。。。如果这就是您想要实现的。

您想要扩展Piece并实现PieceBase,这看起来很奇怪。。。但也许我没看到什么。如果使用了接口,那么实现它的所有类仍然必须定义自己的getter/setter

用抽象类来代替似乎是有意义的


这样,他们都使用相同的getter/setter。。。。如果这就是您想要实现的。

在本例中,我看不到接口的价值。我建议简单地用所需的公共getter和setter定义抽象类片段,然后让您的具体类扩展片段

abstract class Piece { ... common stuff ...}
class Pawn extends Piece { ... pawn-specific stuff ... }
class Knight extends Piece { ... knight-specific stuff ... }
...

在这种情况下,我看不到接口的值。我建议简单地用所需的公共getter和setter定义抽象类片段,然后让您的具体类扩展片段

abstract class Piece { ... common stuff ...}
class Pawn extends Piece { ... pawn-specific stuff ... }
class Knight extends Piece { ... knight-specific stuff ... }
...

<> P>一般认为,在爪哇和C++中,使用继承来实现代码重用(见Joshua Bloch的“有效java”)是一种错误的做法。通常最好使用组合(或其他形式的委托)来代替

在您的情况下,我会完全改变情况,这样
Piece
就是一个
final类
,只需取一个
enum
来表示它的类型:

public期末课堂讲稿{
公共静态枚举类型{
典当{
列出getLegalMoves(颜色c,位置l){/*…*/}
},
主教{/*…*/},
骑士{/*…*/},
车{/*…*/},
女王{/*…*/},
国王{/*…*/};//我希望我没有忘记什么:P
抽象列表getLegalMoves(颜色c,位置l);
//……等等。
}
私有最终类型;
私人最终颜色;
私人位置;
公共物品(类型、颜色、位置){
this.type=type;
这个颜色=颜色;
这个位置=位置;
}
公共列表getLegalMoves(){
返回类型。getLegalMoves(颜色、位置);
}
//……等等。
}

因此,所有片段中通用的所有逻辑在
片段中实现一次,并且不同的部分由
类型
封装。如果你需要知道你正在看什么样的片段,你不需要使用<代码>实例> <代码>和任何东西,你只需执行<代码> Tea.GETType()/<代码>和<代码>开关>代码> .< /P> < P>。通常认为是坏的实践,至少在爪哇和C++中,使用继承来实现代码重用。(参见Joshua Bloch的“有效Java”中的论点)。通常最好使用组合(或其他形式的委托)

在您的情况下,我会完全改变情况,这样
Piece
就是一个
final类
,只需取一个
enum
来表示它的类型:

public期末课堂讲稿{
公共静态枚举类型{
典当{
列出getLegalMoves(颜色c,位置l){/*…*/}
},
主教{/*…*/},
骑士{/*…*/},
车{/*…*/},
女王{/*…*/},
国王{/*…*/};//我希望我没有忘记什么:P
抽象列表getLegalMoves(颜色c,位置l);
//……等等。
}
私有最终类型;
私人最终颜色;
私人位置;
公共物品(类型、颜色、位置){
this.type=type;
这个颜色=颜色;
这个位置=位置;
}
公共列表getLegalMoves(){
返回类型。getLegalMoves(颜色、位置);
}
//……等等。
}

因此,所有片段中通用的所有逻辑在
片段
中实现一次,不同的部分由
类型
封装。如果您需要知道正在查看的片段类型,您不需要使用
instanceof
和cast或其他任何东西,只需实现
片段.getType()
在这一点上切换

也许用抽象代替接口?也许用抽象代替接口?我试过用抽象类,但我无法将片段传递给方法。例如movePiece(片段)只适用于接口或具体类,但对于抽象类,我必须为movePiece(Pawn Pawn)movePiece(Rook Rook)创建6个不同的方法,这些方法对于抽象类应该可以很好地工作。如果您按照您所说的定义它,movePiece(Piece Piece)…并将您的片段实例化为Piece Rook=new Rook()当然,我不确定你为什么要让棋子定义你的移动,因为每个棋子都应该有不同的移动功能。我来试试。这是从棋盘上的一个地方移动到另一个地方,移动是