我目前正在尝试制作国际象棋游戏并尝试实现界面,但我无法访问该界面。
public interface IChessPiece
{
bool CheckMove(int row, int col);
}
public class ChessPiece { ... }
public class Pawn : ChessPiece, IChessPiece
{
public bool CheckMove(int row, int col) { ... }
}
public class ChessPieces { public List<ChessPieces> chessPieces; ... }
我似乎无法访问 CheckMove()方法。
board.chessPieces.Find(x => <condition>).CheckMove(row, col);
答案 0 :(得分:5)
您可以将ChessPiece
实现为抽象类:
public interface IChessPiece {
bool CheckMove(int row, int col);
}
// Note "abstract"
public abstract class ChessPiece: IChessPiece {
...
// Note "abstract"
public abstract bool CheckMove(int row, int col);
}
// Pawn implements IChessPiece since it's derived form ChessPiece
public class Pawn: ChessPiece {
// Actual implementation
public override bool CheckMove(int row, int col) { ... }
}
答案 1 :(得分:2)
您的课程还需要实施IChessPiece
界面,并且最有可能将其设为abstract
,因为它不应该直接实例化。然后,您应该将主板上的List
更改为IChessPiece
类型:
public class ChessPiece : IChessPiece { ... }
public class Pawn : ChessPiece, IChessPiece
{
public bool CheckMove(int row, int col) { ... }
}
public class ChessPieces { public List<IChessPieces> chessPieces; ... }
答案 2 :(得分:1)
在IChessPiece
课程中实施ChessPiece
。
public class ChessPiece : IChessPiece { ... }
我似乎无法访问CheckMove()方法。
因为您知道ChessPieces实现CheckMove,但编译器没有。
如果你不想在IChessPiece
课程中实现ChessPiece
接口,那么你需要像
((IChessPiece)(board.chessPieces.Find(x => <condition>))).CheckMove(row, col);
答案 3 :(得分:1)
两种可能性:
您可能希望在ChessPiece类中实现该接口 - 由于接口名称,它对我更有意义。如果需要在派生类中实现该方法,则将其设为抽象方法。
获取实施界面的所有ChessPieces列表:ChessPieces.OfType<IChessPiece>
答案 4 :(得分:1)
ChessPiece
没有CheckMove
方法。你可以这样做:
public abstract class ChessPiece : IChessPiece
{
public abstract bool CheckMove(int row, int col);
}
这确保了从ChessPiece基类派生的任何人都必须实现CheckMove方法。任何来自ChessPiece的类都将实现IChessPiece。
public class Pawn : ChessPiece // implicitly also implements IChessPiece
{
public override bool CheckMove(int row, int col)
{
}
}
然而,接口的想法是,在使用它们时,实现应该无关紧要。因此,您的List<ChessPiece>
应该真的是List<IChessPiece>
- 这实际上已经足够了,因为添加到该列表中的任何项必须实现IChessPiece,但基类是无关紧要的。< / p>