C# 让类实现不同接口以限制客户端操作时的设计问题

C# 让类实现不同接口以限制客户端操作时的设计问题,c#,java,oop,interface,C#,Java,Oop,Interface,假设我正在定义一个实现两种不同视图的游戏类: interface IPlayerView { void play(); } interface IDealerView { void deal(); } 游戏在玩游戏时看到的视图,以及庄家在玩游戏时看到的视图(即,玩家不能进行庄家操作,庄家不能进行玩家操作)。游戏定义如下: class Game : IPlayerView, IDealerView { void play() { ... } void deal(

假设我正在定义一个实现两种不同视图的游戏类:

interface IPlayerView {
    void play();
}

interface IDealerView {
    void deal();
}
游戏在玩游戏时看到的视图,以及庄家在玩游戏时看到的视图(即,玩家不能进行庄家操作,庄家不能进行玩家操作)。游戏定义如下:

class Game : IPlayerView, IDealerView {
    void play() { ... }
    void deal() { ... }
}
现在假设我想让玩家可以玩这个游戏,但不是去处理它。我最初的想法是

public Game GetGame() { ... }
我想要点像这样的

public IPlayerView GetGame() { ... }
但经过一些测试后,我意识到如果我稍后尝试此代码,它会起作用:

IDealerView dealerView = (IDealerView)GameClass.GetGame();
这样做可以让用户充当经销商

我担心得太多了吗?您通常如何处理这种模式?我可以创建两个不同的类,可能是“主”类,经销商类,作为玩家类的工厂。这样我就可以准确地控制我想传递给公众的信息。另一方面,这使得一切都比原来的设计复杂一些


谢谢

首先,您正在尝试创建一个负责两个松散相关事物的类。我将把这个实现分为至少两个类。把方法“play”给一个在你的设计中应该调用它的播放器怎么样

第二,你太担心了。像接口这样的语言特性和像模式这样的设计特性并不是为了保护您免受自己(或其他开发人员)的伤害。如果有人想滥用它,他们会(我想这就是所谓的“黑客”)。它们使您的生活更加轻松,代码更加可维护、可消耗和可测试


总会有滥用代码的方法。如果不是通过浇铸,则使用反射。让它去吧,集中精力打造“下一个大事件”.

创建一个视图实现类,然后将视图对象传递给工厂对象,并使用该工厂获得相应的视图。明天,如果您需要实现一个以上的视图,则可以轻松地进行增强。

我认为使用两个不同的方法play()和deal(),不会有多大好处,因为这样您就不会真正执行任何运行时多态性

从概念上讲,您需要的是一个play()方法,但对Player和Dealer类有不同的实现。 从较高的层次来看,庄家和玩家都在玩游戏,因此使用play()方法,但他们实际玩游戏的方式不同,庄家交易(牌)和玩家下注


因此,与Georgy所说的一致,最好改变设计,使其更具逻辑性,更易于开始。。我通常在开始时尽可能简单,无论如何,在未来迭代的适当过程中,它们往往会过载和负担过重。

这里的想法不是实现多态性!正在限制用户访问。在这种情况下,一个简单的安全功能可能是添加一个最终的布尔playerMode(带有私有setter),并在创建播放器时将其设置为true,然后在deal()方法中,您可以检查它是否是播放器并停止deal()