2013-01-08 12 views
8

Mam interfejs o właściwościach:nie może uzyskać dostępu realizowane nieruchomość (z interfejsem)

public interface IEntityModifier 
{ 

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

} 

Potem wdrożenia go:

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

Ale kiedy potrzebują dostępu AutoDetachOnFinished obrębie tej samej klasy, A błąd kompilatora wyskoczy:

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 */ } 
      } 
     } 
    } 

komunikat o błędzie:

14 „MEngine.Entities.EntityModifier.SingleValueEntityModifier” ma nie zawierają definicji „AutoDetachOnFinished” i nie przedłużenie metodę „AutoDetachOnFinished” zaakceptowaniem pierwszego argumentu typu „MEngine.Entities.EntityModifier.SingleValueEntityModifier” może być znaleźć (czy brakuje using dyrektywa lub odwołania do zestawu ?)

mam 2 pytania:

  1. Dlaczego kompilator uskarża się na usunięcie IEntityModifier. s (aby IEntityModifier.Update stałoby się Update, dotyczy jakiejkolwiek zaimplementowanej metody)?
  2. Dlaczego nie mogę uzyskać dostępu do AutoDetachOnFinished?

Odpowiedz

12

Zaimplementowano je jako explicit interface implementations, co oznacza, że ​​można uzyskać do nich dostęp tylko za pomocą zmiennej typu interfejsu - IEntityModifier.

Albo zrobić:

if (((IEntityModifier)this).AutoDetachOnFinished) 

lub usunąć nazwę interfejsu od implementacji:

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

Bo wdrażają interfejs wyraźnie.

bool IEntityModifier.AutoDetachOnFinished { get; set; } 

Musisz rzucić do interfejsu, aby uzyskać dostęp do jawnych implementacji. Być może nie to, co chcesz. Więc usunąć nazwę interfejsu od implementacji

bool AutoDetachOnFinished { get; set; } 
1

Konwersja this.AutoDetachOnFinished do obiektu typu IEntityModifier jak robisz implementację interfejsu wyraźny. here some explanation.

IEntityModifier entitymodifier=(IEntityModifier)objectInstanceOfimplementedClass; 

    if(entitymodifier.AutoDetachOnFinished) 
Powiązane problemy