0

私のプログラムには、次のコードがあります。

 private void SetCorners<T>(T position, int width, int height)
    {
        float halfWidth = width / 2 + position.X;
        float halfHeight = height / 2 + position.Y;

        UpperLeft = new Vector2(-halfWidth, -halfHeight);
        UpperRight = new Vector2(halfWidth, -halfHeight);
        LowerLeft = new Vector2(-halfWidth, halfHeight);
        LowerRight = new Vector2(halfWidth, halfHeight);
    }

ここで、T はVector2またはVector3fromMicrosoft.Xna.Frameworkです。Tそれらの定義が含まれていないため、このコードはビルドされません。このメソッドを機能させるにはどうすればよいですか?

4

4 に答える 4

3

Vector2およびVector3が派生または実装する共通の基本クラスまたはインターフェイスがないため、Xおよび をY直接受け取るメソッドを作成し、この新しいメソッドを呼び出す 2 つのヘルパー メソッドを作成します。

private void SetCorners(Vector2 position, int width, int height)
{
    SetCorners(position.X, position.Y, width, height);
}

private void SetCorners(Vector3 position, int width, int height)
{
    SetCorners(position.X, position.Y, width, height);
}

private void SetCorners(float x, float y, int width, int height)
{
    float halfWidth = width / 2 + x;
    float halfHeight = height / 2 + y;

    UpperLeft = new Vector2(-halfWidth, -halfHeight);
    UpperRight = new Vector2(halfWidth, -halfHeight);
    LowerLeft = new Vector2(-halfWidth, halfHeight);
    LowerRight = new Vector2(halfWidth, halfHeight);
}

これにより、自分自身を繰り返さずに ( DRY )、 と の両方Vector2をサポートできますVector3

于 2013-02-19T12:31:52.443 に答える
1

2 つの構造体のラッパー クラスを作成することもできます。

private void SetCorners<T>(T position, int width, int height)
    where T : MyVectorWrapper
{
    float halfWidth = width / 2 + position.X;
    float halfHeight = height / 2 + position.Y;

    UpperLeft = new Vector2(-halfWidth, -halfHeight);
    UpperRight = new Vector2(halfWidth, -halfHeight);
    LowerLeft = new Vector2(-halfWidth, halfHeight);
    LowerRight = new Vector2(halfWidth, halfHeight);
}

class MyVectorWrapper
{
    public float X { get; set; }
    public float Y { get; set; }

    public MyVectorWrapper(dynamic vector2)
    {
        X = vector2.X;
        Y = vector2.Y;
    }
}

使用例:

var v2 = new Vector2(1, 2);
var v3 = new Vector3(v2, 3);
SetCorners<MyVectorWrapper>(new MyVectorWrapper(v2), width, height);
SetCorners<MyVectorWrapper>(new MyVectorWrapper(v3), width, height);
于 2013-02-19T13:09:25.333 に答える
0

Vector2とVector3に共通のインターフェイスまたは基本クラスがあるかどうかはわかりませんが、次のようにジェネリックメソッドに制約を追加できます。

private void Method<T>(T bla)
  where T : BaseInterfaceOrBaseClass
{ ... }
于 2013-02-19T12:34:16.390 に答える
0

Vector2次に、 forとfor の 2 つの別々のメソッドを記述しVector3ます。一般的に言えば、ジェネリック型の制約を使用できますが、これはここでは少し人工的すぎると思います。

于 2013-02-19T12:32:39.153 に答える