1

特定の部分にのみアクセスする必要があるオブジェクトがある場合、その特定の部分だけを渡す必要がありますか、それともオブジェクト全体を渡す必要がありますか?

私の場合、XNA を使用して C# でゲームを構築しており、「DrawLayer.cs」の Camera クラスの「境界」にアクセスする必要があります。これは、単一のレイヤーを描画するクラスです (視差のために複数のレイヤーがあると仮定します)。ゲームの画面に。カメラの「境界」は、以下のプロパティとして存在します。

    public Rectangle Bounds { get { return onScreenCamera.Bounds; } }

このゲームは、アクションに応じてプレイヤー間でジャンプするカメラを持つマルチプレイヤー ゲームであるため、「onScreenCamera」は現在使用する必要があるカメラを参照します。また、カメラの機能はプレイヤーのタイプによって異なるため、ここで説明しているカメラが実装するインターフェイス ICameraSetup.cs を作成しました。ICameraSetup インターフェイスは次のとおりです。

interface ICameraSetup
{
    Vector2 Position { get; }
    Rectangle Bounds { get; }

    void Update(GameTime pGameTime);
}

DrawLayer.cs では、コンストラクター ヘッダーを次のように記述したいと思いました (Rectangle は構造体であり、値型であることを意味することに注意してください)。

    public DrawLayer(ref Rectangle pBounds)

そしてコンストラクター呼び出しでは、次のようになりました。

    new DrawLayer(ref levelState.Camera.Bounds)

これは、カメラの境界のみを DrawLayer.cs に渡すことになりますが、「プロパティ Game.Camera.ICameraSetup.Bounds には setter がありません」というエラーが発生しているようです。問題は、境界を設定できる唯一のクラスがカメラクラスであり、境界が設定される方法が上記のカメラクラスのプライベート変数を介して行われるため、インターフェイスで境界のセッターを宣言したくないことです。 、「onScreenCamera」と呼ばれます。

しかし、Set を Bounds プロパティに追加しても、DrawLayer.cs コンストラクター呼び出しで「'ref' 引数は変数として分類されていません」というエラーが発生します。

さて、私が知っている解決策の 1 つは、次のように、カメラ全体を DrawLayer.cs に渡し、そこから境界を使用することです。

    public DrawLayer(ICameraSetup pCamera)

それから

    new DrawLayer(levelState.Camera)

次にCamera.Boundsを使用しますが、必要なのはそのクラスの境界だけなので、これは不要のようです。

私が抱えている可能性のある別の問題は、参照渡しの理解にあります。渡したクラスの外部で値に加えられた変更に合わせて値型参照を更新する必要がある場合に役立つことを理解しましたが、それが逆であることも読みました。最初に宣言された場所の外で値の型を変更し、同じままにします。

カメラの境界の DrawLayer への参照渡しを間違えているのでしょうか?

4

2 に答える 2

1

最初のエラーを無視しています:

プロパティ、インデクサー、または動的メンバー アクセスは、out または ref パラメーターとして渡すことはできません。

さらに、このように参照によって引数を渡すことは、設定できることを意味しますが、Boundsプロパティのパブリック セッターを定義していないため、設定できません。したがって、2 つの問題があります。

よくわかりません; そもそも参照渡ししようとしているのはなぜですか?後で変更できるように、このオブジェクトへの参照を保存しますか (参考: できません)。正直なところ、私には貧弱なデザインのように聞こえます。これはパフォーマンスの問題ではないようですので、デザインを微調整することをお勧めします。

このような奇妙で扱いにくい/うまく機能しないものに出くわした場合、それは通常、設計上の問題があることを意味します。より多くの設計上の問題を導入してそれを修正しようとしないでください。

于 2012-07-11T00:38:46.230 に答える
0

参照によってプロパティを渡すことはできません。プロパティは変数ではないため、これは理にかなっています。プロパティはコンパイラによって getter/setter メソッドとして実装されます。

ただし、Bounds プロパティをフィールドに変更するか、Bounds の値を保持するローカル変数を作成すると、'ref' キーワードを使用して渡すことができます。

「ref」で何かを渡す主な理由は、変数を新しいインスタンスに置き換えるなど、変数の任意の部分を変更できる必要があり、それが呼び出し元のコードに反映されることが期待される場合です。

Bounds にアクセスしたいだけの場合は、'ref' を使用しないでください。Bounds が構造体であり、パフォーマンス上の理由からコピーしたくない場合は、Bounds をクラスにすることを検討してください。

于 2012-07-11T01:01:20.630 に答える