C# 掷骰子……看,但不要';触摸不到
有没有人想过将完整对象作为变量传递,而不是仅仅指向完整对象函数的指针 例如,我有一个骰子对象,有两种方法:C# 掷骰子……看,但不要';触摸不到,c#,oop,C#,Oop,有没有人想过将完整对象作为变量传递,而不是仅仅指向完整对象函数的指针 例如,我有一个骰子对象,有两种方法: RollDice(),使骰子计数随机化 GetCount(),检索该值 现在,我需要利用骰子不仅仅是玩家移动,其他物体也需要能够看到骰子。现在,在我看来,将整个骰子对象传递给这些其他对象是错误的,因为从技术上讲,这些对象可以重新掷骰子。只将GetCount函数指针传递给这些其他对象是好还是坏编程?基本上是说“我不会给你骰子,但我会教你怎么读。” 想法?为什么不给它们传递一个整数呢?这意
- RollDice(),使骰子计数随机化
- GetCount(),检索该值
想法?为什么不给它们传递一个整数呢?这意味着它们与骰子分离
如果您使用依赖项注入将骰子注入到每个移动的服务对象中,那么创建一个只包含GetCount()方法的接口。为什么不给它们传递一个整数?这意味着它们与骰子分离
如果您使用依赖项注入将骰子注入到每个移动的服务对象中,那么创建一个只包含GetCount()方法的接口。您可以为骰子创建一个包装类,使其不可变。包装器可以通过委托或子类化和重写RollDice()来实现。然后传递包装器对象,而不是可变骰子对象,以确保它不会更改。您可以为骰子创建包装器类,使其不可变。包装器可以通过委托或子类化和重写RollDice()来实现。然后传递一个包装器对象,而不是可变的骰子对象,以保证它不会改变。听起来骰子对象应该具有DiceValue或FaceValue属性。您可以传递该值,而不是传递骰子本身。这可以控制对骰子行为的访问,还可以避免仅传递面的整数值而产生的代码气味。它还可以使骰子值更抽象,以便以后可以使用数字以外的值,如特殊面值等。听起来骰子对象应该具有DiceValue或FaceValue属性。您可以传递该值,而不是传递骰子本身。这可以控制对骰子行为的访问,还可以避免仅传递面的整数值而产生的代码气味。它还可以使骰子值更抽象,以便以后可以使用数字以外的值,如特殊面值等。使用观察者模式(GoF)似乎是一个极好的机会
公共类骰子
{
非公开名单观察员;
公共无效注册表观察者(IDiceObserver观察者)
{
this.observer.Add(observer);
}
私人Int32计数;
公共Int32计数
{
得到
{
返回这个.count;
}
专用设备
{
this.count=值;
foreach(此.obsers中的IDiceObserver观察者)
DiceRolled(新的DiceParameters(this.count));
}
}
公共无效滚动骰子()
{
this.Count=new Random(DateTime.Now.毫秒).Next();
}
公众骰子()
{
this.obsers=新列表();
}
}
您是否需要关于模式或其他类实现的任何进一步解释???使用观察者模式(GoF)似乎是一个极好的机会
公共类骰子
{
非公开名单观察员;
公共无效注册表观察者(IDiceObserver观察者)
{
this.observer.Add(observer);
}
私人Int32计数;
公共Int32计数
{
得到
{
返回这个.count;
}
专用设备
{
this.count=值;
foreach(此.obsers中的IDiceObserver观察者)
DiceRolled(新的DiceParameters(this.count));
}
}
公共无效滚动骰子()
{
this.Count=new Random(DateTime.Now.毫秒).Next();
}
公众骰子()
{
this.obsers=新列表();
}
}
您需要关于模式或其他类实现的进一步解释吗???什么编程语言?另外,如果您不想将函数指针传递给
GetCount
函数,为什么不将di(c)e的值作为一个数字传递呢?@Matt-我正在用c#处理这个问题,我很欣赏大家对这个问题的见解。什么编程语言?另外,如果您不想将函数指针传递给GetCount
函数,为什么不将di(c)e的值作为一个数字传递呢?@Matt-我正在用c#处理这个问题,我很欣赏大家对这个问题的见解。您的意思是用一个不可变的实现来扩展Dice,从而消除RollDice吗?在我看来,这打破了Liskov替换原则,因为RollDice不再具有调用类所期望的行为。@Martin-你的观点是正确的。“我认为对于这样的事情,委托体系结构要干净得多。@Martin-经过更多的思考,我认为只要稍微改变一下子类型,子类型建议就可以干净地工作:使(可变)骰子类成为不可变类的子类。”。我不认为如果超类没有指定它是不可变的,而只是提供了没有掷骰子的方法,那么打破LSP就可以了。这肯定解决了这个特殊的问题:)“不需要更多,承诺不会更少”。我个人更喜欢下面的解决方案,因为我认为它更接近真实世界,但你的解决方案很好。@Martin-我同意。您的解决方案更加优雅。您的意思是用一个不可变的实现来扩展Dice,从而消除RollDice吗?在我看来,这打破了Liskov替代原理,因为RollDice不再具有e的行为
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>();
}
}