3

私はこのゲームを作っていますが、構造に問題があります。Structureというクラスを作成し、Traps、Shelter、Fireplaceなどの他のクラスはこのクラスを継承しています。ゲーム内のタイルには独自のクラス(タイル)があり、そのタイルの構造のリストがあります。リストに含まれているタイルに構造をうまく構築できます。トラップなどのクラスから関数にアクセスしようとすると、問題が発生します。機能しません。基本クラスStructureの関数しか使用できません。

タイルのリスト:

class Tile
{
     public List<Structure> Structures = new List<Structure>();
}

トラップや他の建物を建てる方法:

        bool anyFireplace = Bundle.map.tile[Bundle.player.X, Bundle.player.Y].Structures.OfType<Shelter>().Any();
        if (!anyFireplace)
        {
            woodlogsCost = 4;
            if (Bundle.player.Woodlogs - woodlogsCost >= 0)
            {
                Bundle.map.tile[Bundle.player.X, Bundle.player.Y].Structures.Add(new Shelter(Bundle.player.X, Bundle.player.Y));
                Bundle.player.Woodlogs -= woodlogsCost;
            }
        }

構造を描くとき(ここに私の問題があります、コメントに注意してください)

foreach (Structure s in Bundle.map.tile[x, y].Structures)
{
   if (s is Fireplace)
{
   //This is the function from base class Strucure
   s.ColorBody(g, 10, x - minx, y - miny, 0, Brushes.Firebrick);

   // The function that I wan´t to use but can´t be used
   //s.ColorBody(g, x - minx, y - miny); 
}
if (s is Shelter)
{
s.ColorBody(g, 10, x - minx, y - miny, 1, Brushes.ForestGreen);
}
if (s is Sleepingplace)
{
   s.ColorBody(g, 10, x - minx, y - miny, 2, Brushes.Brown);
}
if (s is Trap)
{
   s.ColorBody(g, 10, x - minx, y - miny, 3, Brushes.Silver);
}
if (s is Barricade)
{
   s.ColorBody(g, 10, x - minx, y - miny, 4, Brushes.DarkOliveGreen);
}
}

Soo ...使用したくない機能にアクセスするにはどうすればよいですか?

4

3 に答える 3

6

基本クラスに仮想メソッドを追加します。

public class Structure
{
   public virtual void ColorBody(Graphics g, int someParam1, int someParam2)
   {
       // do nothing in the base class
   }
}

FireBody のメソッドをオーバーライドします

public class FireBody : Structure
{
    public override void ColorBody(Graphics g, int someParam1, int someParam2)
    {
        // do something here for FireBody
    }
}

から継承するすべてのクラスStructureがそれを必要とする場合は、それを抽象化します。

public abstract class Structure
{
   public abstract void ColorBody(Graphics g, int someParam1, int someParam2);
}
于 2013-01-31T09:01:25.087 に答える
4

コンピューターにs Structure. Fireplaceクラスだけが持っていて抽象クラスには持っていない特定のメソッドを呼び出したい場合Structure(例えばFireplace、クラスが持つBurnWood()意味がないメソッドをクラスが持っている可能性があるStructure)、コンピュータにこれStructureが実際には(たとえば)も。Fireplaceしたがって、キャストすることでこれを行うことができます。例えば:

((Fireplace)s).ColorBody(g, x - minx, y - miny); 

また

(s as Fireplace).ColorBody(g, x - minx, y - miny); 

キャストとオペレーターの使用の違いについては、この投稿を参照してください。as

于 2013-01-31T09:02:04.647 に答える
1

あなたの質問からわかるように、2 つのクラスに 2 つのオーバーロードされた関数があります。つまり、基本クラスと派生クラスでは、関数パラメーターの数が異なります。

この場合、以下に示すように、コンパイル型のポリモフィズムをサポートする必要があります。

 public BaseQueryClass
{
    public string QueryClassFunc(string mystring, int i)
    {
        return mystring + i.ToString();
    }
}

public QueryClassDerived : BaseQueryClass
{
    public string QueryClassFunc(string mystring)
    {
        return mystring;
    }
}

以下に示すように、メソッドを呼び出すことができます

 BaseQueryClass qClass = new BaseQueryClass();
        qClass.QueryClassFunc("mystring", 1);

        ((QueryClassDerived)qClass).QueryClassFunc("test");

ここで何も見逃していないことを願っています

于 2013-01-31T09:26:15.493 に答える