作为视频游戏的一部分,我需要存储玩家资料。
如果我有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()
?
答案 0 :(得分:5)
您应该创建一个界面,例如
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(尤其是界面隔离和依赖反转部分)。
答案 1 :(得分:1)
我非常确定您建议的方法从设计的角度来看并不是最好的,但您可以使用以下方法实现:
StackFrame frame = new StackFrame(1);
var method = frame.GetMethod();
var type = method.DeclaringType; //caller's type
var name = method.Name; //method name