9

私はプロパティを持つインターフェースを持っています:

public interface IEntityModifier
{

    ...
    bool AutoDetachOnFinished { get; set; }
    bool Finished { get; }
    ...

}

それから私はそれを実装します:

    bool IEntityModifier.AutoDetachOnFinished { get; set; }
    bool IEntityModifier.Finished { get { return this.mFinished; } }

しかしAutoDetachOnFinished、同じクラス内でアクセスする必要がある場合、コンパイラエラーが表示されます。

    void IEntityModifier.Update(IEntity pEntity, Microsoft.Xna.Framework.GameTime pGameTime)
    {
        if (!this.mFinished)
        {
            this.Value += this.Delta * (float)pGameTime.ElapsedGameTime.TotalSeconds;

            if (this.Value >= this.Max)
            {
                this.Value = this.Max;
                this.mFinished = true;
                if (this.AutoDetachOnFinished) { /* Error Here */ }
            }
        }
    }

エラーメッセージ:

14「MEngine.Entities.EntityModifier.SingleValueEntityModifier」には「AutoDetachOnFinished」の定義が含まれておらず、「MEngine.Entities.EntityModifier.SingleValueEntityModifier」タイプの最初の引数を受け入れる拡張メソッド「AutoDetachOnFinished」が見つかりませんでした(ディレクティブまたはアセンブリ参照?)

2つの質問があります:

  1. IEntityModifier.sを削除するとコンパイラが文句を言うのはなぜですか(実装されたメソッドに適用されるようIEntityModifier.Updateになります)?Update
  2. なぜアクセスできないのAutoDetachOnFinishedですか?
4

3 に答える 3

13

これらを明示的なインターフェイス実装として実装しました。つまり、インターフェイス タイプ - の変数を介してのみアクセスできますIEntityModifier

どちらかを行います:

if (((IEntityModifier)this).AutoDetachOnFinished)

または、実装からインターフェイス名を削除します。

bool AutoDetachOnFinished { get; set; }
bool Finished { get { return this.mFinished; } }
于 2013-01-08T10:22:12.207 に答える
3

インターフェイスを明示的に実装しているためです。

bool IEntityModifier.AutoDetachOnFinished { get; set; }

明示的な実装にアクセスするには、インターフェイスにキャストする必要があります。おそらくあなたが望むものではありません。したがって、実装からインターフェイス名を削除します

bool AutoDetachOnFinished { get; set; }
于 2013-01-08T10:25:17.230 に答える
1

明示的なインターフェイスの実装を行っているため、this.AutoDetachOnFinished を IEntityModifier 型のオブジェクトに変換します。ここでいくつかの説明。

  IEntityModifier entitymodifier=(IEntityModifier)objectInstanceOfimplementedClass;

     if( entitymodifier.AutoDetachOnFinished)
于 2013-01-08T10:59:23.727 に答える