如何限制哪些类可以更改另一个非相关类中字段的值

本文关键字:另一个 字段 何限制 | 更新日期: 2023-09-27 18:28:17

作为视频游戏的一部分,我需要存储玩家档案。

如果我有这样的Player类:

public class Player
{
    public string username { get; private set; }
    public int numberOfWins { get; private set; }
    public void AddWin()
    {
        numberOfWins++;
    }
}

和像这样的Game类:

public class Game
{
    Player playerOne;
    Player playerTwo;
    int playerOneScore;
    int playerTwoScore;
    public void HandleGameEnd()
    {
        if (playerOneScore > playerTwoScore)
        {
            playerOne.AddWin();
        }
        else
        {
            playerTwo.AddWin();
        }
    }
}

我将如何更改代码以确保唯一使用AddWin()的是HandleGameEnd()

如何限制哪些类可以更改另一个非相关类中字段的值

您应该创建一个接口,例如

interface ICanAddWin
{
    void AddWin();
}

然后在你的播放器中明确地实现它:

class Player : ICanAddWin
{
    void ICanAddWin.AddWin() { ... }
}

Game应该使用ICanAddWin对象,而不是Player(如果需要,可以添加更多方法)。其他类不知道AddWin方法,除非它们将Player强制转换为内部接口ICanAddWin,这要求它们在同一个程序集中,并为该接口命名空间添加using(实际上,在更好的设计中,每个"客户端"应该只看到它所需的一些特定接口,而不是Player类;强制转换是一种糟糕的做法)。

AddWin方法移动到实现ICanAddWin的单独类(可以是私有的,嵌套在Player中以访问其私有字段)会更好。这样,当您在某个地方传递Player时,您绝对确信它不会被广播到ICanAddWin

为了更好地理解,我建议您学习更多OOP和SOLID(尤其是接口分离和依赖反转部分)。

我很确定你建议的方法从设计角度来看不是最好的,但你可以使用来实现这一点

StackFrame frame = new StackFrame(1);
var method = frame.GetMethod();
var type = method.DeclaringType; //caller's type
var name = method.Name; //method name
相关文章: