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 回答
1

或者:

public class character
{
    public string Name, Owner;
    public int Str, Con, Dex, Int, Wis, Cha, AC, Speed, maxHP, currHP, AP, SV, Surges;
    public int StrMod{
        get{
        return (int)Math.Floor(Str / 2);
        }
    }
}

用于:

character c = new character();
c.Name = "Goofy";
c.Owner = "Me";
c.Str = 15;
MessageBox.Show(c.StrMod);
于 2013-05-02T13:54:33.693 回答
1

是的,您可以创建一个名为的方法Mod来为您计算。它看起来像这样:

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

    public double Mod(int stat)
    {
         return Math.Floor(stat/2);
    }
}
于 2013-05-02T13:54:36.993 回答
1

创建一个接口。使用属性。使用描述性变量名称:

public interface ICharacter
{
    public string Name { get; }

    public int Strength { get; }
}

然后实现它:

public class Character : ICharacter
{
    public string Name { get; private set; }

    public int Strength { get; private set; }

    public Character(string name, int strength)
    {
        this.Name = name;
        this.Strength = strength;
    }
}

现在对于您的问题,您应该让一个班级做一件事。所以现在你可以为角色的伤害修正(或任何“Mod”的意思)创建和初始化计算器:

public class DamageModifierCalculator
{
    public int Calculate(ICharacter character)
    {
        return (int)Math.Floor(character.Strength / 2);
    }
}

现在初始化并调用它:

var character = new Character("Goofy", 15);
var calculator = new DamageModifierCalculator();
int mod = calculator.Calculate(character);

它是可扩展的,它是可测试的,并且它的关注点是分开的。您还需要为计算器创建一个界面,因为您需要更多的界面,最好为每种计算创建一个界面。

或者你可以把它放在你的Character课堂上,但它与 OO 无关了。

于 2013-05-02T13:58:04.993 回答
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

如果 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

对于此操作,您只需执行以下操作:

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 回答
-2
public class character
{
    public string Name, Owner;
    public int Str, Con, Dex, Int, Wis, Cha, AC, Speed, maxHP, currHP, AP, SV, Surges;
    public int MathFunction(int input)
    {
        return (int)(input/2);
    }
}

现在你可以使用

MessageBox.Show(c.MathFunction(c.Str));
于 2013-05-02T13:52:02.457 回答