首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >滚动一些Dice...Look,但不要触摸

滚动一些Dice...Look,但不要触摸
EN

Stack Overflow用户
提问于 2011-03-22 03:52:19
回答 4查看 326关注 0票数 1

是否有人认为将完整对象作为变量传递,而不仅仅是指向完整对象的函数的指针?

例如,我有一个Dice对象,它有两个方法:

  • RollDice(),将骰子计数随机化
  • GetCount()检索该值。

现在,我需要利用骰子不仅仅是玩家移动,其他对象也需要能够看到骰子。现在,在我看来,将整个骰子对象传递给其他对象似乎是错误的,因为那样的话,这些对象就可以“从技术上”重新滚动骰子了。只将GetCount函数指针传递给这些其他对象是好的还是坏的?本质上说,“我不会给你骰子,但我会教你如何阅读。”

有什么想法?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-22 04:05:18

使用观测器模式(GoF)似乎是一个很好的机会;

代码语言:javascript
复制
public class Dice
{
    private List<IDiceObserver> observers;
    public void RegisterObserver(IDiceObserver observer)
    {
        this.observers.Add(observer);
    }

    private Int32 count;
    public Int32 Count
    {
        get
        {
            return this.count;
        }
        private set
        {
            this.count = value;
            foreach (IDiceObserver observer in this.observers)
                observer.DiceRolled(new DiceParameters(this.count));
        }
    }

    public void RollDice()
    {
        this.Count = new Random(DateTime.Now.Millisecond).Next();
    }

    public Dice()
    {
        this.observers = new List<IDiceObserver>();
    }
}

是否需要进一步解释模式或其他类实现?

票数 2
EN

Stack Overflow用户

发布于 2011-03-22 03:55:45

你为什么不给他们一个整数呢?这意味着它们与骰子脱钩。

如果您使用依赖项注入将骰子注入到服务对象中,则创建一个只包含GetCount()方法的接口。

票数 1
EN

Stack Overflow用户

发布于 2011-03-22 03:56:40

您可以为骰子创建一个包装类,使它们不可变。包装器可以通过委托实现,也可以通过子类和重写RollDice()来实现。然后,当您想要保证它不会改变时,传递一个包装器对象而不是一个可变的Dice对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5386572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档