我正在用c#写一个纸牌游戏程序。我有一个Player
类,每个玩家可以存储多张牌。为了简单起见,我们假设每个Player
都有两张牌,VisibleCard
和HiddenCard
。VisibleCard
是每个人都能看到的东西——想象它是你在桌子上打出的一张牌。HiddenCard
是只有玩家才能看到的东西——也就是说,它是玩家会拿在手里的东西。
我想限制HiddenCard
字段,以便只有它所属的播放器对象可以读取它,而所有其他Player对象都不能。换句话说,我想在对象级别封装这些字段,而不是类级别。
我已经写了一个粗略的尝试实现这种行为,但我想知道是否有一个更整洁或更优雅的方式在c#中做到这一点,或者这种方法是否有任何漏洞?
class Program
{
sealed class Player
{
public string Name;
private string VisibleCard { get; }
private string HiddenCard { get; }
public Player(string name, string visibleCard, string hiddenCard)
{
Name = name;
VisibleCard = visibleCard;
HiddenCard = hiddenCard;
}
public void ReadPlayerCard(Player otherPlayer)
{
Console.Write("n{0}'s hidden card: ", otherPlayer.Name);
if (this == otherPlayer)
Console.WriteLine(otherPlayer.HiddenCard);
else
Console.WriteLine("You can't see that.");
Console.Write("{0}'s visible card: ", otherPlayer.Name);
Console.WriteLine(otherPlayer.VisibleCard);
}
}
static void Main(string[] args)
{
Player Alice = new Player("Alice", "Seven of Diamonds", "Four of Clubs");
Player Bob = new Player("Bob", "Queen of Hearts", "Ace of Spades");
Console.WriteLine("Bob is reading Alice's cards:");
Bob.ReadPlayerCard(Alice);
Console.WriteLine("nAlice is reading Alice's cards:");
Alice.ReadPlayerCard(Alice);
Console.ReadLine();
}
}
导致这个结果:
Bob is reading Alice's cards:
Alice's hidden card: You can't see that.
Alice's visible card: Seven of Diamonds
Alice is reading Alice's cards:
Alice's hidden card: Four of Clubs
Alice's visible card: Seven of Diamonds
所以它确实有效,但我想知道:有没有什么方法可以利用这一点?该类是密封的,因此不能继承,但我不确定这是否是封装来自同一类型的其他对象的成员的最直接的方法。
有什么建议吗?
访问修饰符的用途
所有访问修饰符的目的都是帮助程序员同伴*避免对他不应该做的类做一些事情。它们不以任何方式、形式或形式提供安全性。
你不应该过度使用它们。很多时候,一个不必要的访问器迫使程序员从头开始重写整个库——因为他们需要一个没有合理理由被标记为私有的部分。
多人游戏中的安全性
多人游戏中的第一个安全级别是不显示用户不应该拥有的信息。唯一的规避方法就是直接访问内存。访问修饰符不会以任何方式、形状或形式使攻击更加困难。
多人游戏中的第二个安全级别是首先不向客户端程序传输信息。没有内存访问可以检索不存在的信息。访问修饰符在我所能想象的任何方面都没有帮助。
*这个程序员同事可能就是你未来的自己。你应该写注释的原因是,在1-6个月内,你会完全忘记代码的一切。所以你自己可能就是那个需要从过去的自己那里得到指导的人——或者不得不从头开始重新学习整个课程。