2016-04-03 19 views
0

私は基本的なテキストRPGゲームであるC#プログラムを書いています。ゲームを保存するときに、キャラクターからデータを取得してxmlファイルに書き込む保存関数にそのキャラクターを渡したいと思います。私は1つの基本クラス文字と3つの派生クラス:騎士,ローグウィザードを持っています。彼らはそれぞれxmlファイルに書きたい特殊なintを持っています。パラメータとして基本ケースを持つ関数の派生クラスを渡す

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 
    { 
    } 
} 
関連する問題