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”的定义,并且没有扩展方法“AutoDetachOnFinished”接受“MEngine.Entities.EntityModifier.SingleValueEntityModifier”类型的第一个参数(您是否缺少使用指令还是程序集引用?)

我有两个问题:

  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 回答