如何从其他相同类型的对象中隐藏 class 成员?
How can I hide a class member from other objects of the same type?
我正在用 C# 编写纸牌游戏程序。我有一个Player
class,每个玩家可以存放多张牌。为简单起见,假设每个 Player
有两张牌,VisibleCard
和 HiddenCard
。 VisibleCard
是每个人都可以看到的东西 - 想象它是您在 table 上打出的一张牌。 HiddenCard
是只有玩家可以看到的东西 - 即玩家会拿在手里的东西。
我想限制 HiddenCard
字段,以便 只有它所属的 Player 对象可以读取它,而所有其他 Player 对象不能。换句话说,我想在对象级别封装这些字段,而不是class级别。
我写了一个粗略的尝试来实现这个行为,但我想知道在 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
所以它确实有效,但我想知道:有什么方法可以利用它吗? class是密封的,所以不能继承,但我不确定这是否是封装其他同类型对象成员的最直接的方法。
有什么建议吗?
访问修饰符的用途
所有访问修饰符的目的是帮助其他程序员*做一些他不应该做的 class 事情。他们不以任何方式、形式或形式提供安全保障。
而且你不应该过度使用它们。 unessesary acessor 经常迫使程序员从头开始重写整个库 - 因为他们需要一个没有合理原因被标记为私有的部分。
多人游戏的安全性
多人游戏中的第一个安全级别是不显示用户不应拥有的信息。避免这种情况的唯一方法是直接内存访问。访问修饰符不会以任何方式、形状或形式使攻击变得更难。
多人游戏中的第二个安全级别是首先不将信息传输到客户端程序。没有内存访问可以检索不存在的信息。访问修饰符再次对我能想象的任何方式没有帮助。
*这位程序员同事可能就是你未来的自己。你应该写评论的原因是,在 1-6 个月内你将完全忘记关于该代码的一切。所以你自己可能是需要他过去的自己的这种指导的人 - 或者必须从头开始重新学习整个 class。
我正在用 C# 编写纸牌游戏程序。我有一个Player
class,每个玩家可以存放多张牌。为简单起见,假设每个 Player
有两张牌,VisibleCard
和 HiddenCard
。 VisibleCard
是每个人都可以看到的东西 - 想象它是您在 table 上打出的一张牌。 HiddenCard
是只有玩家可以看到的东西 - 即玩家会拿在手里的东西。
我想限制 HiddenCard
字段,以便 只有它所属的 Player 对象可以读取它,而所有其他 Player 对象不能。换句话说,我想在对象级别封装这些字段,而不是class级别。
我写了一个粗略的尝试来实现这个行为,但我想知道在 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
所以它确实有效,但我想知道:有什么方法可以利用它吗? class是密封的,所以不能继承,但我不确定这是否是封装其他同类型对象成员的最直接的方法。
有什么建议吗?
访问修饰符的用途
所有访问修饰符的目的是帮助其他程序员*做一些他不应该做的 class 事情。他们不以任何方式、形式或形式提供安全保障。
而且你不应该过度使用它们。 unessesary acessor 经常迫使程序员从头开始重写整个库 - 因为他们需要一个没有合理原因被标记为私有的部分。
多人游戏的安全性
多人游戏中的第一个安全级别是不显示用户不应拥有的信息。避免这种情况的唯一方法是直接内存访问。访问修饰符不会以任何方式、形状或形式使攻击变得更难。
多人游戏中的第二个安全级别是首先不将信息传输到客户端程序。没有内存访问可以检索不存在的信息。访问修饰符再次对我能想象的任何方式没有帮助。
*这位程序员同事可能就是你未来的自己。你应该写评论的原因是,在 1-6 个月内你将完全忘记关于该代码的一切。所以你自己可能是需要他过去的自己的这种指导的人 - 或者必须从头开始重新学习整个 class。