2013-01-08 20 views
8

我有特性的接口:不能訪問實現的屬性(從接口)

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」可以被 (是否缺少using指令或程序集 參考?)

我有2個問題:

  1. 爲什麼編譯器會報告我刪除IEntityModifier.(因此IEntityModifier.Update會變成Update,適用於任何實現的方法)?
  2. 爲什麼我不能訪問AutoDetachOnFinished

回答

12

您已將這些實現爲explicit interface implementations,這意味着您只能通過接口類型的變量 - IEntityModifier訪問它們。

要麼做到這一點:

if (((IEntityModifier)this).AutoDetachOnFinished) 

或從執行刪除接口名稱:

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

因爲你明確地實現接口。

bool IEntityModifier.AutoDetachOnFinished { get; set; } 

您必須強制轉換爲接口才能訪問顯式實現。也許不是你想要的。因此,從實施

bool AutoDetachOnFinished { get; set; } 
1

轉換this.AutoDetachOnFinished型IEntityModifier的反對,你正在做的顯式接口實現刪除該接口的名稱。 here some explanation.

IEntityModifier entitymodifier=(IEntityModifier)objectInstanceOfimplementedClass; 

    if(entitymodifier.AutoDetachOnFinished)