2

私は弾丸を持っています:

public LaserBullets : Projectile

私は、派生した銃と一緒に行く弾丸タイプの基本武器から継承する銃を持っています:

public LaserWeapon : Weapon<LaserBullets>

プレイヤーの現在の武器を確立するためのプロパティがあります。

public Weapon<Projectile> CurrentWeapon
{
    set { currentWeapon = value; }
}

これは失敗します(暗黙的ににキャストLaserWeaponすることはできませんWeapon<Projectile>

player.CurrentWeapon = new LaserWeapon();

C#での特定の共分散のサポートがないことについて読んだことがありますが、ここで立ち往生しているとは思わないでください。私の状況を機能させる方法はありますか?プレイヤークラスで基本武器を維持しようとしていますが、別のクラスでより具体的な武器を使用しています。

LaserWeapon用に独自のキャスト演算子を作成しようとしましたが、基本クラスとの間でキャストできないというエラーが発生しました。

4

2 に答える 2

5

Weapon<T>次のように宣言された共変インターフェースがあれば、あなたの例はうまくいったと思います。

public interface Weapon<out TProjectile>
{
}

これはTProjectile、が戻り値として使用される場合にのみ機能します。例:

TProjectile Fire();

ただし、が入力パラメータとして使用されている場合は機能しません。例:TProjectile

LoadClip(IEnumerable<TProjectile> ammo);

あなたのコメントから、あなたは一般的な戻り値を求めていることがわかりますので、次のようなインターフェースを作成してください。

public interface IWeapon<out TProjectile> where TProjectile : Projectile
{
    TProjectile Fire();
}

次に、このインターフェース実装を使用します。便利な基本クラスを持つことを妨げるものは何もありません。

public abstract class Weapon<TProjectile> : IWeapon<TProjectile> where TProjectile : Projectile
{
    public abstract TProjectile Fire();
}

プレーヤークラスが次のラインに沿っている限り:

public class Player
{
    public IWeapon<Projectile> CurrentWeapon { get; set; }
}

CurrentWeapon.Fire()これにより、のインスタンスを返すを引き続き使用できますProjectile

于 2012-07-22T23:00:55.833 に答える
1

継承する非ジェネリッククラスWeaponを作成します。コードではWeapon<T>なく、そのクラスを使用してください。Weapon<Projectile>

于 2012-07-22T23:06:54.177 に答える