2013-01-08 24 views
8

Tôi có một giao diện với các thuộc tính:bất động sản không thể truy cập được thực hiện (từ giao diện)

public interface IEntityModifier 
{ 

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

} 

Sau đó, tôi thực hiện nó:

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

Nhưng khi tôi cần phải truy cập AutoDetachOnFinished trong cùng một lớp, một lỗi trình biên dịch xuất hiện:

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

Thông báo lỗi:

14 'MEngine.Entities.EntityModifier.SingleValueEntityModifier' không không chứa một định nghĩa cho 'AutoDetachOnFinished' và không có phương pháp mở rộng 'AutoDetachOnFinished' chấp nhận một cuộc tranh luận đầu tiên của loại 'MEngine.Entities.EntityModifier.SingleValueEntityModifier' có thể được tìm thấy (là bạn thiếu một chỉ thị sử dụng hoặc tham khảo một hội ?)

tôi có 2 câu hỏi:

  1. Tại sao trình biên dịch lại phàn nàn nếu tôi xóa IEntityModifier. s (vì vậy IEntityModifier.Update sẽ trở thành Update, áp dụng cho bất kỳ phương thức được triển khai nào)?
  2. Tại sao tôi không thể truy cập AutoDetachOnFinished?

Trả lời

12

Bạn đã triển khai các trường hợp này là explicit interface implementations, nghĩa là bạn chỉ có thể truy cập chúng thông qua một biến loại giao diện - IEntityModifier.

Hoặc làm điều đó:

if (((IEntityModifier)this).AutoDetachOnFinished) 

hoặc xoá tên giao diện từ việc thực hiện:

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

Bởi vì bạn đang thực hiện giao diện một cách rõ ràng.

bool IEntityModifier.AutoDetachOnFinished { get; set; } 

Bạn phải truyền sang giao diện để truy cập các triển khai rõ ràng. Có lẽ không phải những gì bạn muốn. Vì vậy, loại bỏ tên giao diện từ việc thực hiện

bool AutoDetachOnFinished { get; set; } 
1

Chuyển đổi this.AutoDetachOnFinished phản đối kiểu IEntityModifier như bạn đang làm thực hiện giao diện rõ ràng. here some explanation.

IEntityModifier entitymodifier=(IEntityModifier)objectInstanceOfimplementedClass; 

    if(entitymodifier.AutoDetachOnFinished) 
Các vấn đề liên quan