2

私は C# を使用しており、画面上のオブジェクトを操作する必要があります。座標を保持する構造体をセットアップしてから、移動できる方向の数を制限する列挙型をセットアップします。

private enum Direction
{
    UpperLeft = new Coord(-1, -1), 
    UpperCenter = new Coord(0, -1), 
    UpperRight = new Coord(1, -1),
    Left = new Coord(-1, 0), 
    Right = new Coord(1, 0),
    LowerLeft = new Coord(-1, 1), 
    LowerCenter = new Coord(0, 1),
    LowerRight = new Coord(1, 1)
};

private struct Coord
{
    public int row { get; private set; }
    public int col { get; private set; }
    public Coord(int r, int c) : this()
    {
        row = r;
        col = c;
    }

    public static Coord operator +(Coord a, Coord b)
    {
        return new Coord(a.row + b.row, a.col + b.col);
    }
}

基本的に私が目指しているのは、割り当てられた列挙型に基づいて画面上にあるオブジェクトを移動させることです。

だから私は仮説的にこれか何かのようにそれを使用したいと思います:

public class ThingThatMovesToTheLeft
{
    Direction dir = Direction.Left;
    Coord pos = new Coord(0,0);
    public void Move()
    {
        this.pos = this.dir + this.pos;
    }
}

基本的に私の質問は、列挙型を構造体に型キャストして、この方法で使用できるようにする方法です。私はそれを構造体にキャストすることができないようです。(さらに、VisualStudio では文句を言わずにそれらの Coord 構造体に列挙型を割り当てることができたので、構造体を列挙型に割り当てても問題ないと思いました。これは許容される慣行ですか、それともすべきではありませんか?)

4

3 に答える 3

5

複雑なオブジェクトを静的に利用できるようにしたい場合は、次のように public static 変数を使用する必要があります。

public class Person
{
    public string FirstName {get; set; }
    public string LastName {get; set; }

    public Person(string firstName, string lastName)
    {
        this.FirstName = firstName;
        this.LastName = lastName;
    }
}

public static class People
{
    public static Person Jack= new Person("Jack", "Andersson");
}

これは、Enum が、switch case コンストラクトまたはパイプ演算子で特別な動作をする特別なコンストラクトであるためです。

編集:私は間違っていました。列挙型はプリミティブ型の単なる構文糖衣です。

私は専門家ではないので、別の方法がないことを 100% 確信しているわけではありませんが、道案内クラスを次のようにします。

private static class Directions
{
    private static readonly Coord UpperLeft = new Coord(-1, -1);
    private static readonly Coord UpperCenter = new Coord(0, -1);
    private static readonly Coord UpperRight = new Coord(1, -1),
    private static readonly Coord Left = new Coord(-1, 0); 
    private static readonly Coord Right = new Coord(1, 0);
    private static readonly Coord LowerLeft = new Coord(-1, 1);
    private static readonly Coord LowerCenter = new Coord(0, 1);
    private static readonly Coord LowerRight = new Coord(1, 1);
};
于 2013-10-03T08:43:26.957 に答える
3

列挙enum型をマッピングするタイプを指定しなかったため、宣言が間違っています。

private enum Direction : Coord //good idea, but this won't work ;)
....

ただし、列挙型を構造体またはクラスにマップすることはできません。MSDNドキュメントに基づく

すべての列挙型には基になる型があり、これはchar を除く任意の整数型にすることができます。列挙要素のデフォルトの基になる型は int です。別の整数型 (byte など) の列挙型を宣言するには、次の例に示すように、識別子の後にコロンを使用し、その後に型を続けます。

したがって、上記を試すとCoord、期待される型ではないため、コンパイラが適合をスローすることがわかります。

あなたの問題に対する最善の解決策は、いくつかのconst変数を定義してそれらを使用することだと思います。

于 2013-10-03T08:44:05.460 に答える
1

単純なコンバーターはどうですか?enum から始めましょう:

public enum Direction
{
    UpperLeft = 0, // Coord(-1, -1),
    Left = 1, // Coord(-1, 0),
    LowerLeft = 2, // Coord(-1, 1),
    UpperCenter = 3, // Coord(0, -1),
    LowerCenter = 5, // Coord(0, 1),
    UpperRight = 6, // Coord(1, -1),
    Right = 7, // Coord(1, 0),
    LowerRight = 8, // Coord(1, 1)
}

Coord クラスを保持し、コンバーターを実装します。

private static Coord ConvertDirectionToCoord(Direction dir)
{
    return new Coord((int)dir / 3 - 1, (int)dir % 3 - 1);
}

ThingThatMovesToTheLeft クラスを次のように書くことができます。

public class ThingThatMovesToTheLeft
{
    Direction dir = Direction.Left;
    Coord pos = new Coord(0, 0);
    public void Move()
    {
        this.pos = ConvertDirectionToCoord(this.dir) + this.pos;
    }
}
于 2013-10-03T09:21:39.403 に答える