3

私は gameObject と呼ばれるクラスを持っており、そのプロパティの 1 つが呼び出されcomponent、タイプはobject:

public object component;

objectそして、これを使用して、指定したクラスのオブジェクトを保持できるオブジェクトとして機能させようとしています。例えば

unit c = new unit(...)
gameObject test = new gameObject(...)
test.component = c;

コンポーネントオブジェクトを介してcオブジェクトを使用したい。例えば

if(test.component==typeof(unit))
    test.component.Draw();//draw is a function of the unit object

これは可能ですか?どうすればいいですか?

4

6 に答える 6

7

typeof(unit)もオブジェクトであり、 とは異なりcomponentます。component.GetType()代わりに次のことを行う必要があります。

if(test.component.GetType()==typeof(unit))

これは派生型をチェックしませんが、次のことを行います。

if(test.component is unit)

Drawそれでも、キャストせずに呼び出すことはできません。チェックとキャストを同時に行う最も簡単な方法は次のとおりです。

unit u = test.component as unit;
if (u != null) {
    u.Draw();
}
于 2012-08-31T10:04:12.120 に答える
5

はい、キャスティングといいます。このような:

if(test.component is unit)
  ((unit)test.component).Draw();
于 2012-08-31T10:02:29.183 に答える
5

インターフェイスを使用し、ユニット クラスにそのインターフェイスを実装させます。インターフェイスで Draw() メソッドを定義し、定義したインターフェイスの型としてコンポーネントを宣言します。

public interface IDrawable
{
 void Draw();
}

public IDrawable component;

public class unit : IDrawable
...
于 2012-08-31T10:03:37.200 に答える
3

if (test.component is unit) ((unit)(test.component)).Draw();

于 2012-08-31T10:02:57.243 に答える
1

他の人が言ったように、すべてを との間でキャストできますObject。ただし、インターフェイスの基本クラスを使用して、誰もあなたInt32や他の予期しないタイプを送信しないようにする必要があります。ただし、サポートされているすべての型に共通のメソッドがある場合は、それをインターフェイスに配置することをお勧めします。したがってDraw()、キャストせずに何でもできます。

適切なタイプを強制するだけの空のインターフェースを持つバリアント:

interface IComponent
{
}
class unit : IComponent
{
    //...
}
class enemy : IComponent
{
    //...
}
class gameObject
{
    IComponent component;//now only objects inheriting IComponent can be assigned here

    public void DrawComponent()
    {
        unit u = component as unit;
        if (u != null) {
            u.Draw();
        }
        enemy e = component as enemy;
        if (e != null) {
            e.DrawIfVisible();
        }
    }
}

共通の機能を宣言するインターフェースを持つバリアント:

interface IDrawable
{
    void Draw();
}
class unit : IDrawable
{
    public void Draw(){;}
    //...
}
class enemy : IDrawable
{
    public void Draw(){;}
    //...
}


class gameObject
{
    IDrawable component;

    public void DrawComponent()
    {
        //now you don't need to care what type component really is
        //it has to be IDrawable to be assigned to test
        //and because it is IDrawable, it has to have Draw() method
        if (component != null) {
            component.Draw();
        }
    }
}
于 2012-08-31T10:10:01.647 に答える
0

オブジェクトの特定の動作を使用するには、オブジェクトを特定の型にキャストする必要があります。objectインスタンスとしてのみ使用できる変数で参照しobjectます。

于 2012-08-31T10:05:02.317 に答える