2009-11-10 32 views
10

Tôi đang cố gắng để thực hiện một thiết kế như sau:iPhone Objective-C foreach thiết kế

Touch lớp: Hoạt động như một giao diện, một số lớp kế thừa từ nó:
MoveTouch lớp
JumpTouch lớp
InterfaceTouch lớp

Sau đó, tôi muốn có danh sách các đối tượng Touch. Sau đó tôi muốn có thể loại bỏ tất cả các đối tượng MoveTouch CHỈ (không phải các đối tượng khác), và sau đó tất cả các đối tượng JumpTouch riêng biệt, v.v., nằm ngoài danh sách lớn này. Thật không may, for (MoveTouch* t in touches) không làm những gì tôi muốn; mọi thứ trong toàn bộ danh sách đều được thực hiện.

Trả lời

36

Bạn cần phải kiểm tra cho các loại hình lớp:

for (Touch *t in touches) { 
    if ([t isKindOfClass:[MoveTouch class]]) { 
    MoveTouch *mt = (MoveTouch *)t; 
    // do what you want with mt 
    } 
} 
0

Tôi không phải là một lập trình viên C Mục tiêu.

Trong trường hợp của bạn, tôi nghĩ rằng bạn cần phải đi qua danh sách của bạn với "cho (Touch * trong chạm)" và trong cơ thể tìm ra nếu đối tượng đó là một MoveTouch hoặc JumpTouch và vv.

Nhưng ý tưởng về đa hình là bạn không làm điều này. Bạn không sắp xếp ra ngoài trong vòng lặp của mình. Hành động mà bạn muốn thực hiện phải được xác định trong giao diện và mỗi lớp con cháu thực hiện triển khai khác nhau cho hành động đó. Đó là những gì đa hình là tất cả về.

+0

... có nghĩa là bạn sẽ làm điều gì đó như gọi [t update] và sau đó mỗi mục sẽ quyết định việc cần làm tại chu kỳ cập nhật. Nhưng đó không phải là phổ quát. Có rất nhiều lần khi bạn có một tin nhắn bạn muốn gửi đến một lớp học, và không phải là một người khác. –

+0

không phổ biến, nhưng có xu hướng mùi, theo ý kiến ​​của tôi. Đặc biệt là khi bạn chỉ ra rằng bạn đang thiết kế các lớp học là tốt. –

+0

Tôi thực sự không làm đa hình với điều này. Mong muốn cơ bản của tôi là cách tách biệt các loại chạm khác nhau. Các loại cảm ứng (Move, Jump, Interface, vv) có thể được quyết định ngay lập tức khi tạo ra nó, điều này xảy ra trong "touchesBegan". Từ đó trở đi, việc tách riêng chức năng của những gì sẽ xảy ra khi bạn MOVE chạm vào hoặc nhấn vào liên lạc đó, v.v .. Tôi đoán có lẽ sự kế thừa là một chút ưa thích cho điều này? Có lẽ chỉ là một enum đơn giản sẽ làm việc? –