如何使用 类 和派生 类 之间的接口?
How to use an interface between classes and derived classes?
我目前正在尝试制作国际象棋游戏并尝试实现一个界面,但是我无法访问该界面。
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);
在 ChessPiece
class 中实施 IChessPiece
。
public class ChessPiece : IChessPiece { ... }
I cannot seem to access the CheckMove() method.
因为您知道 ChessPieces 实现了 CheckMove,但编译器没有。
如果您不想将 IChessPiece
接口实现到 ChessPiece
class,那么您需要像
这样的类型转换
((IChessPiece)(board.chessPieces.Find(x => <condition>))).CheckMove(row, col);
您的 class 还需要实现 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; ... }
两种可能性:
您可能希望在 ChessPiece 中实现接口 class - 由于接口名称,它对我来说更有意义。如果你需要在派生的classes中实现这个方法,那就把它变成一个抽象方法。
获取所有实现该接口的ChessPieces列表:ChessPieces.OfType<IChessPiece>
您可以将 ChessPiece
实现为 抽象 class:
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) { ... }
}
ChessPiece
没有CheckMove
方法。你可以这样做:
public abstract class ChessPiece : IChessPiece
{
public abstract bool CheckMove(int row, int col);
}
这确保从 ChessPiece 基础 class 派生的任何人也必须实现 CheckMove 方法。任何从 ChessPiece 派生的 class 也将实现 IChessPiece。
public class Pawn : ChessPiece // implicitly also implements IChessPiece
{
public override bool CheckMove(int row, int col)
{
}
}
但是,接口的理念是在使用它们时,实现应该无关紧要。因此,您的 List<ChessPiece>
实际上应该是一个 List<IChessPiece>
- 这实际上就足够了,因为添加到该列表的任何项目 必须 实现 IChessPiece,但是基础 class 无关紧要。
我目前正在尝试制作国际象棋游戏并尝试实现一个界面,但是我无法访问该界面。
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);
在 ChessPiece
class 中实施 IChessPiece
。
public class ChessPiece : IChessPiece { ... }
I cannot seem to access the CheckMove() method.
因为您知道 ChessPieces 实现了 CheckMove,但编译器没有。
如果您不想将 IChessPiece
接口实现到 ChessPiece
class,那么您需要像
((IChessPiece)(board.chessPieces.Find(x => <condition>))).CheckMove(row, col);
您的 class 还需要实现 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; ... }
两种可能性:
您可能希望在 ChessPiece 中实现接口 class - 由于接口名称,它对我来说更有意义。如果你需要在派生的classes中实现这个方法,那就把它变成一个抽象方法。
获取所有实现该接口的ChessPieces列表:
ChessPieces.OfType<IChessPiece>
您可以将 ChessPiece
实现为 抽象 class:
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) { ... }
}
ChessPiece
没有CheckMove
方法。你可以这样做:
public abstract class ChessPiece : IChessPiece
{
public abstract bool CheckMove(int row, int col);
}
这确保从 ChessPiece 基础 class 派生的任何人也必须实现 CheckMove 方法。任何从 ChessPiece 派生的 class 也将实现 IChessPiece。
public class Pawn : ChessPiece // implicitly also implements IChessPiece
{
public override bool CheckMove(int row, int col)
{
}
}
但是,接口的理念是在使用它们时,实现应该无关紧要。因此,您的 List<ChessPiece>
实际上应该是一个 List<IChessPiece>
- 这实际上就足够了,因为添加到该列表的任何项目 必须 实现 IChessPiece,但是基础 class 无关紧要。