控制台游戏开发求助:如何返回所选特定角色Class实例
解决方法:用基类统一返回类型
首先,你得让所有职业类共享一个基类或者接口,这样你的Menu方法就能返回这个通用类型,不用再纠结返回某个具体职业的实例。这里我假设你创建一个名为Postava的基类(所有角色的父类),让Bojovnik、Lukostrelec等职业类都继承它。
第一步:定义基类
先创建你的基类(如果还没做的话),里面包含所有角色共有的属性和方法,比如你代码里用到的Info():
public abstract class Postava { public string Jmeno { get; protected set; } public Postava(string jmeno) { Jmeno = jmeno; } // 所有子类必须实现的通用方法 public abstract string Info(); }
然后让你的职业类继承它,比如Bojovnik:
public class Bojovnik : Postava { public Bojovnik(string jmeno) : base(jmeno) { } public override string Info() { return $"Bojovník: {Jmeno}"; } }
其他职业类(Lukostrelec、Assassin等)也按同样的方式实现即可。
第二步:修改Menu方法
接下来调整你的Menu方法,让它返回Postava类型,并且在内部保存选中的角色实例:
public static Postava Menu(int cislo) { Postava vybranaPostava = null; // 用基类变量存储选中的角色 bool starthry = false; switch (cislo) { case 1: Console.WriteLine("Vyberte povolání (1-6):"); if (int.TryParse(Console.ReadLine(), out int vyber)) { Console.WriteLine("Zadejte jméno postavy:"); string jmeno = Console.ReadLine(); switch (vyber) { case 1: vybranaPostava = new Bojovnik(jmeno); break; case 2: vybranaPostava = new Lukostrelec(jmeno); break; case 3: vybranaPostava = new Assassin(jmeno); break; case 4: vybranaPostava = new Mag(jmeno); break; case 5: vybranaPostava = new Nekromant(jmeno); break; case 6: vybranaPostava = new Druid(jmeno); break; default: Console.WriteLine("Neplatný výběr!"); break; } starthry = vybranaPostava != null; // 只有选了有效职业才标记可开始游戏 } break; case 2: if (vybranaPostava != null) { // 用using语句确保资源自动释放 using (FileStream fs = new FileStream(@"../../Postava.dat", FileMode.CreateNew, FileAccess.Write)) using (StreamWriter sw = new StreamWriter(fs)) { sw.Write(vybranaPostava.Info()); } } else { Console.WriteLine("Nejprve vyberte postavu!"); } break; case 3: // 这里可以添加加载角色的逻辑 break; case 4: // 其他功能逻辑 break; case 5: Console.WriteLine("Chcete otevřít dokument s postavami? (Y/N)"); if (Console.ReadLine()?.Trim().ToUpper() == "Y") { string postavy = @"C:\Users\Dominik\source\repos\Pokus_o_hru_LOL\Pokus_o_hru_LOL\bin\Debug\netcoreapp3.1\Postava.docx"; using (Process proces = new Process()) { proces.StartInfo = new ProcessStartInfo() { UseShellExecute = true, FileName = postavy }; proces.Start(); proces.WaitForExit(); } } break; case 6: Environment.Exit(0); break; default: Console.WriteLine("Neplatná volba v hlavním menu!"); break; } return vybranaPostava; // 返回选中的角色实例(无选中则返回null) }
关键改动说明:
- 统一返回类型:把
Menu方法的返回类型从模糊的"something"改成Postava,这样不管用户选哪个职业,都能通过基类类型返回。 - 保存实例到方法级变量:不再在每个case里创建局部变量,而是给
vybranaPostava赋值,确保方法结束时能拿到这个实例。 - 空值检查:在保存角色到文件的逻辑里,先检查
vybranaPostava是否为null,避免空引用异常。 - 资源优化:对
FileStream和Process使用using语句,确保资源被正确释放,避免内存泄漏。
使用方法
调用Menu方法后,你可以拿到返回的Postava实例,直接用基类的通用方法,或者根据需要向下转型访问特定职业的专属方法:
Postava mojePostava = Menu(1); // 假设用户进入选职业的菜单 if (mojePostava != null) { Console.WriteLine($"Vítej, {mojePostava.Info()}!"); // 这里可以开始你的游戏逻辑 }
内容的提问来源于stack exchange,提问作者Dominik Kolouch
相关产品推荐
相关产品推荐

