0

クラスを作成しました:

public class character
{
    public string Name, Owner;
    public int Str, Con, Dex, Int, Wis, Cha, AC, Speed, maxHP, currHP, AP, SV, Surges;
}

ご覧のとおり、現時点では非常に単純なクラスです。私の質問は、この中に別のクラスを作成する方法があるので、関数を呼び出すときに数式を返すことができるかどうかです。

例:

character c = new character();
c.Name = "Goofy";
c.Owner = "Me";
c.Str = 15;
MessageBox.Show(c.Str.Mod);

ウィンドウへの出力は "7" になります (Mod は: Math.Floor(Str / 2);)

私はしばらくの間、SO と Google の両方を検索しようとしてきましたが、まだこれを理解していません。間違ったフレーズを検索している可能性があります。または、これが不可能な場合もあります。

ありがとう

4

10 に答える 10

5

私がすぐに考えることができる唯一の方法は拡張メソッドです

class Program
{
    static void Main(string[] args)
    {
        character c = new character();
        c.Name = "Goofy";
        c.Owner = "Me";
        c.Str = 15;
        Console.WriteLine(c.Str.Mod());
        Console.Read();
    }
}

public class character
{
    public string Name, Owner;
    public int Str, Con, Dex, Int, Wis, Cha, AC, Speed, maxHP, currHP, AP, SV, Surges;
}

public static class Ext
{
    public static int Mod(this int value)
    {
        return (int)Math.Floor(value / 2.0);
    }
}
于 2013-05-02T13:55:36.917 に答える
3
public class Character // C should be uppercase here.
{
   public string Name, Owner;
   public int Str, Con, Dex, Int, Wis, Cha, AC, Speed, maxHP, currHP, AP, SV, Surges;

   public double ModMe()
   {
      return Math.Floor(this.Str / 2); // Math.Floor returns double
   }
}

character c = new character();
c.Name = "Goofy";
c.Owner = "Me";
c.Str = 15;
MessageBox.Show(c.ModMe());
于 2013-05-02T13:53:41.197 に答える
1

統計に Int フィールドを使用するのではなく (少なくともあなたの例では)、次のように Stat クラスを作成します。

public class character
{
    public string Name, Owner;
    public int AC, Speed, maxHP, currHP, AP, SV, Surges;

    public Stat Str { get; set; }
    public Stat Con { get; set; }
    public Stat Dex { get; set; }
    public Stat Int { get; set; }
    public Stat Wis { get; set; }
    public Stat Cha { get; set; }

    public class Stat
    {
        public Stat(int stat)
        {
           Value = stat;
        }
        public int Value { get; set; }
        public int Mod { get { /*Calcuate Mod from Value.*/; } }
    }

}

そして、次のように呼び出します。

character c = new character();
c.Name = "Goofy";
c.Owner = "Me";
c.Str = new Stat(7);
MessageBox.Show(c.Str.Value); //The Value
MessageBox.Show(c.Str.Mod);   //The Mod of Strength
于 2013-05-02T14:12:31.243 に答える
0

Mod が任意の整数に適用できる操作である場合、それを拡張メソッドとして定義できます。

static class ExtendInt
{
    static public int Mod(this int stat)
    {
        return stat / 2;
    }
}

class UseExtendedInt
{
    void UseIt()
    {
        int a = 1;
        int b = a.Mod();
    }
}

ExtendInt を一意の名前空間内に配置すると、その名前空間を機能させたいファイルでのみ使用できますが、それ以外の場合は、その名前空間内のすべての整数に対して使用可能な関数になります。

変数名に応じて異なる操作が必要な場合は、リフレクションを組み込むか、Mod に渡す計算タイプを識別する列挙型を定義する必要があります。

ほとんどの場合、計算の種類が異なる場合は、strMod、conMod などのプロパティを定義したほうがよいでしょう...

于 2013-05-02T14:04:18.603 に答える
0

Strその正確な構文を使用するには、別のタイプである必要があります。int から変換でき、次の名前のプロパティを持つものMod:

public class character {

  // A type that is convertible from int and has a Mod property
  public class Modder {

    //private variable to hold the integer value
    private int _value;

    // private constructor that is used by the converter
    private Modder(int value){ _value = value; }

    // implicit converter to handle the conversion from int
    public static implicit operator Modder(int value) {
      return new Modder(value);
    }

    // Property Mod that does the calculation
    public int Mod {
      get { return _value / 2; }
    }

  }

  public string Name, Owner;
  public int Con, Dex, Int, Wis, Cha, AC, Speed, maxHP, currHP, AP, SV, Surges;
  public Modder Str;

}

そのクラスをクラス内に配置しましたcharacterが、そうである必要はありません。

于 2013-05-02T14:06:44.520 に答える
0

この操作では、次のことができます。

int x = (int)15 / 2;

また、ネストされたクラス、つまりクラス内にクラスを作成することもできます。たとえば、クラス内に次のようなものがあります。

public class MathOperator
{
 public int Mod(int x)
 {
  return (int)x/2;
 }
}

そして、クラスでこのネストされたクラスのインスタンスを作成し、c.Str で使用します。

于 2013-05-02T13:56:26.803 に答える