繁体   English   中英

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

[英]How do I limit what classes can change the value of a field in another non related class

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

如果我有这样的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方法移动到一个单独的类(可以是专用嵌套在Player以访问其私有字段)实现ICanAddWin 这样当你在某个地方传递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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM