在函数中传递派生类,基本情况为参数

时间:2016-04-03 18:56:09

标签: c# oop inheritance polymorphism

我正在写一个C#程序,这是一个基本的文本RPG游戏。当我保存游戏时,我想将该角色传递给一个保存函数,然后从该角色获取数据并将其写入xml文件。我有一个基类字符和三个派生类: Knight Rogue 向导。它们每个都有一个特殊的int,我想写一个xml文件。

private void Save(Character c, string file) {
    //Sample part of writing the data
    XmlNode nodeName = playerData.CreateElement("name");
    nodeName.AppendChild(playerData.CreateTextNode(c.name));
    nodeDetails.AppendChild(nodeName);
}

我想将 Knight Rogue 向导传入此函数,并能够在派生类中获取任何变量不在基类中的。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

是的,通过使用铸造。

private void Save(Character c, string file)
{
    if(c is Knight)
    {
        k = (Knight)c;
        // Do whatever with k
    }
    else if (c is Rogue)
    {
        r = (Rogue)c;
        // Do whatever with k
    }
}

然而,这破坏了你设置的多态结构 - 多态性的全部意义在于你不应该这样做。

如果Character类具有返回保存所需数据的abstractvirtual方法,那将是更好的做法。每个子类都会覆盖此方法以返回所需的信息(包括该子类的任何特殊信息),因此您永远不需要检查传递的Character类型。

答案 1 :(得分:0)

看看这是否有帮助

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Rogue rogue = new Rogue();
            Save(rogue, "1234");
        }
        static void Save(Character c, string file)
        {
            if(c.GetType() == typeof(Knight))
            {
            }
            if (c.GetType() == typeof(Rogue))
            {
            }
            if (c.GetType() == typeof(Wizard))
            {
            }


        }
    }

    public class Character
    {
    }
    public class Knight : Character
    {
    }
    public class Rogue : Character
    {
    }
    public class Wizard : Character
    {
    }
}