1

これは OOP ベースのロールプレイング ゲームです。オブジェクトをインターフェースとして扱うのに問題があります。

abstract class Items
{
   public string name { get; set; }

}

すべてのアイテムには名前があります。これは私が取得しようとしているプロパティです。

interface Ieatable
{
   int amountHealed { get; set; }
}

プレイヤーを回復します。

class Healers : Items, Ieatable
{

    private int heal;

    public int amountHealed
    {
        get { return heal; }
        set { heal = value; }
    }

    public Healers(int amount, string name)
    {
        heal = amount;
        base.name = name;
    }

}

ここで食べられるものを扱っています。選手用バックパックの各アイテムを確認します。次に、その商品が食べられるかどうかを確認します。次に、プレイヤーのバックパック内のアイテムの1つがパラメーターとして渡された食べられるアイテムと同じかどうかを確認するのに苦労している部分です。

public void eatSomethingt(Ieatable eatable)
    {
        foreach (Items i in items ) //Go through every item(list) in the players backpack
        {
            if (i is Ieatable && i.name == eatable.name) //ERROR does not contain definition for name
            {
                Ieatable k = i as Ieatable;
                Console.WriteLine(Name + " ate " + eatable.name); //Same ERROR here.
                life = life + k.amountHealed;
                items.Remove(i);
                break;
            }

        }

    }
4

3 に答える 3

3

そうでなければ定義します。

// The base interface for all items.
public interface INamedItem
{
    string Name { get; set; }
}

// all classes are derived from INamedItem, so you can always have the Name property.
public interface IEatable : INamedItem
{
    int AmountHealed { get; set; }
}

public class Healers : Ieatable
{

    public string Name { get; set; }
    public int AmountHealed { get; set; }

    public Healers(int amountHealed, string name)
    {
        AmountHealed = amountHealed;
        Name = name;
    }

}

例:

public void eatSomethingt(IEatable eatable)
{
    var eatItem = items.OfType<IEatable>.Where( item => item.Name == eatable.Name).FirstOrDefault();

    if (eatItem == null)
        return;

    life = life + eatItem.amountHealed;
    Console.WriteLine(Name + " ate " + eatable.name); //Same ERROR here.
    items.Remove(i);


}
于 2013-09-16T19:58:48.360 に答える
2

メソッドを機能させるために他の回答が示しているように、デザインを変更する必要はありませんEatSomething。渡されるもののタイプを変更するだけです。

public void eatSomethingt(Healer healer)
{
    foreach (Items i in items)
    {
        if (i is Ieatable && i.name == healer.name)
        {
            Ieatable k = i as Ieatable;
            Console.WriteLine(Name + " ate " + healer.name);
            life = life + k.amountHealed;
            items.Remove(i);
            break;
        }
    }
}

この回答に対する注意点は、 (または)IEatableではなく、である何かが必要な場合があることです。ただし、その場合、比較する名前がない可能性があるため、別のメソッドが必要になります。ItemHealer

IEatableあなたがメソッドに渡しているのはどこから来たのですか? 在庫アイテムをマウスでクリックしたことが原因だと思います。したがって、次のようにすることができます。

public void eatSomethingt(Healer item)
{
    Console.WriteLine(Name + " ate " + item.name);
    life = life + item.amountHealed;
    items.Remove(item);
}
于 2013-09-16T20:21:52.093 に答える