如何从其他相同类型的对象中隐藏 class 成员?

How can I hide a class member from other objects of the same type?

我正在用 C# 编写纸牌游戏程序。我有一个Playerclass,每个玩家可以存放多张牌。为简单起见,假设每个 Player 有两张牌,VisibleCardHiddenCardVisibleCard 是每个人都可以看到的东西 - 想象它是您在 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。