2012-11-09 35 views
9
private Vector2 ResolveCollision(ICollidable moving, ICollidable stationary) 
{ 
    if (moving.Bounds.Intersects(stationary.Bounds)) 
    { 
     if (moving is Player) 
     { 
      (Player)moving.Color = Color.Red; 
     } 
    } 
    // ... 
} 

Tôi có lớp Player triển khai ICollidable. Đối với mục đích gỡ lỗi, tôi chỉ cố gắng vượt qua một loạt các ICollidables để phương pháp này và làm một số công cụ đặc biệt khi đó là người chơi. Tuy nhiên, khi tôi cố gắng truyền diễn viên đến Player của số ICollidable Tôi gặp lỗi khi nói rằng ICollidable không có thuộc tính Color.Tại sao truyền này từ giao diện sang lớp không thành công?

Tôi không thể tạo diễn viên theo cách này hay tôi đang làm điều gì đó sai?

+3

Chỉ cần một trường hợp parantheses sai: '((Player) di chuyển) .Color = ...' – Davio

+1

bạn nên nói ((Player) di chuyển) .Color = Color.Red nếu Màu là một thuộc tính của Người chơi – wxyz

+1

Vấn đề mới của tôi là cách tôi quyết định câu trả lời để chấp nhận. Tôi không bao giờ có thể bị lỗi trang web này để được làm chậm ... – ssb

Trả lời

16

tôi muốn đề nghị sử dụng as thay vì is:

Player player = moving as Player; 
if (player != null) 
{ 
    player.Color = Color.Red; 
} 

Ưu điểm là bạn chỉ làm việc kiểm tra loại một lần.


Lý do cụ thể khiến mã của bạn không hoạt động (như được đề cập trong các câu trả lời khác) là do operator precedence. Nhà điều hành . là nhà điều hành chính có mức độ ưu tiên cao hơn so với toán tử đúc là nhà điều hành đơn nhất. mã của bạn được hiểu như sau:

(Player)(moving.Color) = Color.Red; 

Thêm dấu ngoặc đơn theo đề nghị của câu trả lời khác giải quyết vấn đề này, nhưng thay đổi để sử dụng as thay vì is làm cho vấn đề này đi hoàn toàn.

9

Cú pháp của bạn đang đúc Color đến Player, không phải moving.

((Player)mover).Color = Color.Red; 
//^do the cast ^access the property from the result of the cast 

Ngoài ra, as có xu hướng đẹp hơn một chút. Nếu nó không thành công, kết quả là null:

var player = moving as Player; 
if(player != null) 
{ 
    player.Color = Color.Red; 
} 
+0

'is' và sau đó một diễn viên hầu như giống với' as' và sau đó là một null kiểm tra. Trong cả hai trường hợp, sẽ không có ngoại lệ. – Servy

2

Bạn nên thêm dấu ngoặc thêm:

((Player)moving).Color = Color.Red; 
2

Bạn cần ngoặc xung quanh các diễn viên và các biến:

((Player)moving).Color = Color.Red; 

nếu không bạn đang cố gắng để cast moving.Color-Player.

2

Bạn đã quên một khung:

thay đổi

để

((Player)moving).Color = Color.Red; 

Bạn cũng có thể sử dụng as operator để cast.

Player p = moving as Player; 
if (p != null) 
{ 
    p.Color = Color.Red; 
} 
3

Nó không phải là nó không hoạt động, đó là cú pháp "hơi" sai.

Hãy thử điều này:

((Player) moving).Color = Color.Red; 
Các vấn đề liên quan