2009-04-18 16 views
0

私は現在、AIをプログラムすることを学ぶいくつかのXNAのものについて試しています。とにかく、ここに私の状況です:クラスAは、クラスBのインスタンスへの参照を取り、それにいくつかのものを行い、それを返す関数を持っています。クラスBはクラスAのインスタンスを含み、そこから関数を呼び出します。コード内"this"を引数として渡す - C#

例:「これは、」読み取り専用であるため、当然、

Class A 
{ 
    B classB; 

    public A() 
    { 
     classB = new B(); 
    } 

    public void Act() 
    { 
     this = B.Do(ref this); 
    } 
} 

Class B 
{ 
    public A Do(ref A classA) 
    { 
     //Manipulate 
     return classA; 
    } 
} 

私はmemberwiseクローンを渡して試してみた..しかし、それは動作しませんでした。私はこれでは分かりません。私は本当に立ち往生している。誰にもアイデアはありますか?理想的には、オブジェクト内のすべての変数を個別の引数として渡す必要がないようにしたいと思います。

アンディ。

答えて

2

クラスは参照型です削除します。次にAで、

Class A 
{ 
    B classB; 

    public A() 
    { 
     classB = new B(); 
    } 

    public void Act() 
    { 
     B.Do(this); 
    } 
} 

注:「これは、あなたが渡すことの参照が(それだけでnullにローカル変数を設定します)nullに設定することができないという副作用持っています」 - JulianR

+1

これは、渡すAの参照をnullに設定することはできません(ローカル変数をnullに設定するだけです)。これはrefパラメータが必要な元の理由かもしれません。 – JulianR

+0

それは良い点です。私はそれがOPの意図だったとは思わなかった(そうではなかった)が、そうであったかもしれない。これを指摘するために編集します。 –

0

クラス参照をrefとして渡す必要がある// Manipulateに固有のものがありますか?そしてなぜあなたはまたclassAを返すのですか?あなたがrefで始まるなら、それは冗長であるようです。

+0

すべては、単純なAI(EGチェイス、ガード、回避など)のためのものです。 AIエンティティ全体をビヘイビアに渡して、ビヘイビアをすべてのエンティティ(複数のスタイルシートのための単一のスタイルシートのような)に分けることができます。 私がオブジェクト全体を渡したい理由は、オブジェクトの特定の部分を必要とし、一部の動作がオブジェクトの特定の部分を必要としているということです。 なぜ戻ってくるのかについては、どうやってその決定に至ったのか分かりません。私はそれを削除します。 –

+0

複数のページのための単一のスタイルシート! –

0

refキーワードを削除するだけです。引数を何かに変更したいのであれば、refを必要とします。それを操作したいだけならrefを使わないでください。

あなたがこれを変更することを許可した場合、それはあなたが試したことを許さないので、それは悪い(理解するのは難しい)と思います。

0

"this"で "ref"を使用することはできません。 パラメータを参照渡しにする必要があるのはなぜですか?

呼び出し元が参照しているオブジェクトを関数で変更する必要がある場合は、「ref」パラメータが必要です。必要なのは、パラメータのフィールドを操作したり変更したりするだけであれば、refパラメータは必要ありません。

1

あなたのB.Do()メソッドは、refとreturnを使用して(Aを変更する)ダブルを行います。 classAを変更する必要もありません。そして、あなたがthisをターゲットにしているため、とにかく動作しません。 thisには決して割り当てられません。意味がありません。

だから、簡単な答えは

class B 
{ 
    void Do(A anA) { anA.PublicProp = 1; } 
} 

である。しかし、円形の参照は、それ怪しげなデザイン作りません。

+0

+1は循環参照の疑わしいデザインの言及のために+1。 –

0

もっと明確にするために、すべてが単純なAI(EGチェース、ガード、回避など)のためのものです。私はすべてのエンティティ(複数のWebページのための単一のスタイルシートのような)のために振る舞いを別々に保つことができるように、AIエンティティ全体を振る舞いに渡したいと思っています。私がオブジェクト全体を渡したいのは、オブジェクトの特定の部分が必要な動作もあれば、動作しない動作もあるからです。

なぜ私が帰ってくるのか、私はその決定にどのようになったのかよく分かりません。私は、オブジェクトのクラスAの参照を操作する必要があります

Class B 
{ 
    public void Do(A classA) 
    { 
     //Manipulate 
    } 
} 

をやって、それ

0

ありがとう、デレクE!

私があなたの言ったことをテストしたところ、うまくいきました。

私の問題は、私が引数を渡したときに、そのクローンを作成し、その代わりに(私は思う..)PHPやVBで(覚えていない)

0

オブジェクトは常に値渡しではなく参照渡しされます。 C#でクラスを参照型として呼び出すのはこのためです。構造体が値型であるため、代わりに構造体を使用している場合は注意してください。元の構造ではなく、構造のコピーが渡されます。オリジナルを渡す場合は、refというキーワードを追加する必要があります。 refは、あるオブジェクトへの参照を別のオブジェクトへの参照に置き換えたい場合にのみオブジェクトで便利です。

関連する問題