2016-04-03 99 views
0

我正在寫一個C#程序,這是一個基本的文字RPG遊戲。當我保存遊戲時,我想將角色傳遞到一個保存函數,然後從該角色獲取數據並將其寫入一個xml文件。我有一個基類字符和三個派生類:騎士,流氓,和嚮導。它們每個都有一個特殊的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); 
} 

我想在騎士盜賊,或嚮導到這個函數來傳遞,並能得到任何變量在派生類中沒有的基類。有沒有辦法做到這一點?

+0

如果所有或某些子類型最終具有不能完全拉入基類型的不同屬性,請考慮查看https://en.wikipedia.org/wiki/Visitor_pattern以進行雙重調度。 – kai

回答

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

+0

謝謝。我想我會接受你的建議,並在基類中添加一個方法來覆蓋我的派生類。 –

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 
    { 
    } 
} 
相關問題