2017-08-09 21 views
1

NavObjectまたはGameObjectを受け入れるためにオーバーロードされるFollowForce()とAvoidForce()の2つのメソッドがあります。両方の型を受け入れるためにFollow()関数を単純化する方法はありますか?オーバーロードされたメソッドの汎用関数

public void Follow(NavObject target){ 
     if(isFollowing){Body.AddForce(FollowForce(target));} 
     if(isAvoiding){Body.AddForce(AvoidForce(target));} 
    } 

public void Follow(GameObject target){ 
     if(isFollowing){Body.AddForce(FollowForce(target));} 
     if(isAvoiding){Body.AddForce(AvoidForce(target));} 
    } 

私は次のことを試してみましたが、cannot convert 'T' expression to type 'NavObject'を得た:

public void Follow <T>(T target){ 
     if(isFollowing){Body.AddForce(FollowForce(target));} 
     if(isAvoiding){Body.AddForce(AvoidForce(target));} 
    } 
+1

ほとんどの場合、 'NavObject'オブジェクトと' GameObject'オブジェクトがどのように見えるか、また 'FollowForce'メソッドと' AvoidForce'メソッドを見る必要があります。 – krillgar

+1

同じ基本クラスから継承するには 'NavObject'と' GameObject'が必要です( 'FollowForce()'と 'AvoidForce()'は基底クラスの型のパラメータを受け入れるべきです)。あるいは、同じインタフェースを実装するために 'NavObject'と' GameObject'が必要です( 'FollowForce()'と 'AvoidForce()'はインタフェースの型のパラメータを受け入れるべきです)。 – user1304444

+0

あなたの質問にFollowForceとAvoidForceを編集として表示する必要があります。あなたが望むものは可能かもしれませんが、それらの方法が何をするかによって異なります。つまり、私はオーバーロードされたバージョンに固執します。 –

答えて

1

あなたのオブジェクトが共有している場合、パラメータとしてtargetを受け入れているあなたのFollowForceAvoidForce機能も

0

をタイプ "T" を受け入れなければなりませんあなたは抽象基本クラスまたはインターフェイスTrackedObjectを導入し、NavObjectGameObjectにそれらを拡張する必要があります。 あなたはその後、TrackedObject

2

潜在的に、その後も型でなければなりませんFollowForceAvoidForceの次

public void Follow(TrackedObject target){ 
    if(isFollowing){Body.AddForce(FollowForce(target));} 
    if(isAvoiding){Body.AddForce(AvoidForce(target));} 
} 

あなたの静的関数のパラメータを記述することができ、あなたもこれでジェネリックを使用する必要はありません。 NavObjectGameObjectのインターフェイスを作成して、FollowForceAddForceのメソッドで必要とされるすべてのプロパティ/メソッドを実装することもできます。

public void Follow(IHaveForce target) 
{ 
    if (isFollowing) 
    { 
     Body.AddForce(FollowForce(target)); 
    } 
    if (isAvoiding) 
    { 
     Body.AddForce(AvoidForce(target)); 
    } 
} 

次に、あなたの他の方法は次のように設定する必要があります:

public Force FollowForce(IHaveForce target) 
{ 
    // Do your work... 
} 

public Force AvoidForce(IHaveForce target) 
{ 
    // Do your work... 
} 

あなたは全体で同じタイプを強制したい場合は、ジェネリックを利用する必要がある唯一の理由は次のようになります。あなたが提供した最小限のシナリオでは、それが必要なものであるかのように見えません。とにかくジェネリックスを使用したい場合は、汎用タイプにIHaveForceを実装することもできます。

+0

完全免責事項:私はジェネリックスの**巨大な**プロポーザルですが、これは必要ではないシナリオです。 – krillgar

関連する問題