C# OOP中RandomHintGame类构造函数故障排查求助
修复RandomHintGame构造函数的异常问题
让我帮你拆解这两个构造函数的核心问题,以及对应的修复方案:
先说说为啥会出异常
构造函数2的无限递归炸栈
你看构造函数2的定义:
public RandomHintGame(Person person) : this(person)
这里的this(person)会直接调用它自己(因为参数类型完全匹配),相当于构造函数一启动就无限循环调用自己,很快就会触发StackOverflowException——这是最致命的问题。
没正确访问Person的属性
构造函数2里的HasHat、EyeColor、Gender都是Person类的属性,但你直接写这些词,编译器会以为你要访问当前RandomHintGame类的成员,肯定会报编译错误。你得明确引用传入的Person对象,或者从基类Game里获取存储的Person实例。
构造函数1不符合需求
你的需求是构造函数要自动生成随机提示,但构造函数1是直接接收外部传进来的randomHint,完全没做生成逻辑,这显然不符合设计要求。
具体修复步骤
1. 干掉无限递归
把构造函数2里的this(person)改成base(person),直接调用基类Game的构造函数,而不是自己调用自己。
2. 正确引用Person属性
假设基类Game把传入的Person实例存成了可访问的属性(比如public Person Person { get; }),那你可以用base.Person来访问它的属性;或者直接用构造函数参数里的person对象。比如把HasHat改成person.HasHat,这样就能正确获取Person的属性值了。
3. 调整构造函数1(可选)
如果确实需要保留这个构造函数,要么让它调用构造函数2来复用随机生成逻辑,要么如果需求不允许外部传入提示,直接删掉它就行。
修复后的完整代码
class RandomHintGame : Game { string randomHint; static Random r = new Random(); // 主构造函数:负责生成随机提示 public RandomHintGame(Person person) : base(person) { GenerateRandomHint(); } // 可选:如果需要支持自定义提示(不符合原需求的话可以删掉) public RandomHintGame(string customHint, Person person) : base(person) { this.randomHint = customHint; } // 把生成提示的逻辑抽成私有方法,方便复用和修改 private void GenerateRandomHint() { int randomNumber = r.Next(0, 3); Person target = base.Person; switch (randomNumber) { case 0: // 把布尔值转成自然语言,避免输出True/False randomHint = $"The person {(target.HasHat ? "has" : "does not have")} a hat."; break; case 1: randomHint = $"The person has {target.EyeColor} eyes."; break; case 2: randomHint = $"The person is a {target.Gender}"; break; } } }
额外小建议
- 把生成提示的逻辑抽成单独的方法,后续要改提示规则的话,只需要改这一个地方,维护起来更方便。
- 静态的
Random实例是对的,要是每次生成提示都新建Random,很容易出现重复的随机数。 - 如果
HasHat是布尔类型,记得转成自然语言,不然提示会显示The person True a hat,太奇怪了。
内容的提问来源于stack exchange,提问作者Student
相关产品推荐
相关产品推荐

