5

私は Microsoft XNA フレームワークを使用してゲーム プロジェクトに取り組んでいますが、この質問はクラス/システムの分離を伴う一般的なものです。

ここに示すように、クラス(この例に合わせて簡略化)があるとしましょう:

public class GameCell
{   
        public Color Color { get; set; }
}

C# を使用する複数のプラットフォーム間で、できるだけ多くのコードを再利用したいと考えています。

Color構造体を直接参照する場合の問題は、この型が XNA アセンブリで定義され、コードと XNA の間に強い結合 (または依存関係) が作成されることです。

私が使用する他のフレームワークには、独自のプロパティと API のセットを持つ独自のColorオブジェクトがある場合とない場合があります。

XNAまたは他のフレームワークの実装を自動的に使用するために、同じソースファイルを「認識」させたいと思います。

IoC などの他のタイプのデカップリング メソッドは知っていますが、それは、異なるコンテキストで同じクラスを再利用するのではなく、異なるバージョンのシステム/クラスをプラグインすることを意味します。

これは可能ですか?そのようなシステムをポータブルに保つためにどのように提案しますか?

(ネイティブ C++ 開発で) 使用しているフレームワークが持つクラスをミラーリングする一連のクラスを定義するケースをいくつか見てきました (たとえば、ここで - Color を再度定義します)。これを後で必要に応じて異なるクラスを使用するためにマップします。

もう 1 つのオプションは、#IFDEF を使用して、クラスのヘッダーの using ステートメントをいじることです (XNA から他のプラットフォームに切り替える)。この場合の最良の代替手段は何ですか?

4

1 に答える 1

5

通常、独自のColor構造を作成し、条件付きコンパイル スイッチを使用して変換を行います。例えば:

#define USE_DOTNET
//#define USE_SOMETHINGELSE

#if USE_DOTNET
using System.Drawing;
#endif

#if USE_SOMETHINGELSE
using SomethingElse.Drawing;
#endif

public struct MyColor
{
    #if USE_DOTNET
    Color TheColor;
    #endif
    #if USE_SOMETHINGELSE
    SomethingsColor TheColor;
    #endif

    public int R
    {
        get
        {
            #if USE_DOTNET
                // code to return .NET Color.R value
            #endif
            #if USE_SOMETHINGELSE
                // code to return SomethingColor.R value
            #endif
         }
    }
}

もう 1 つの方法は、.NET コードと SomethingElse コード用に別の領域を用意することです。例えば:

#if USE_DOTNET
public int R
{
    get { return TheColor.R; }
}
// other properties and methods here
#endif

#if USE_SOMETHINGELSE
// properties and methods for using SomethingElse
#endif

Colorこれはうまく機能しますが、.NET構造をこれらのポータビリティ レイヤー以外で使用しないように、コードを記述するときは十分に注意する必要があります。

Windows、Mac、およびいくつかの異なるゲーム コンソールで実行する必要があるゲームを開発するときに、C/C++ でこの手法を使用しました。ポータビリティ層をセットアップするのは面倒ですが、いったんセットアップすると、非常に使いやすくなります。

ただし、移植性のクラスおよび構造体に、.NET ライブラリまたは使用している他のライブラリのクラスまたは構造体と同じ名前を付けないように注意してください。そうすれば、自分自身を混乱させることになり、移植しようとするまで発見できない移植性のないコードを書く可能性が高くなります。(私が経験や何かから話しているわけではありません. . .)

于 2011-12-02T20:18:05.050 に答える