You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

控制台游戏开发求助:如何返回所选特定角色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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 18:02:59