2014-11-04 29 views
7

Tôi nhận được ngoại lệ thời gian chạy khi tôi cố gắng truyền một đối tượng đến giao diện mà tôi chắc chắn rằng nó thực hiện.Tài liệu tham khảo giao diện Downcasting

Tôi có giao diện như sau:

public interface class ISMILTimeContainer; 
public interface class ISMILSequence : ISMILTimeContainer; 
public interface class ISMILParallel : ISMILTimeContainer; 

Tôi đã các lớp sau:

ref class TimeContainer : public ISMILTimeContainer; 
ref class Sequence : public TimeContainer, ISMILSequence; 
ref class Parallel : public TimeContainer, ISMILParallel; 

Sau đó, tôi thử như sau:

ISMILTimeContainer^ container = getSequence(); // returns a Sequence^ 
ISMILSequence^ sequence = static_cast<ISMILSequence^>(container); 

này ném một ngoại lệ lúc chạy -time:

Nền tảng :: InvalidCastException^tại vị trí bộ nhớ 0x04AFD83C. HRESULT: 0x80004002 Không có giao diện như vậy được hỗ trợ

Theo tôi có thể biết, điều này sẽ hoạt động. Có điều gì đó sai trái với những gì tôi đang cố gắng làm hay làm các triệu chứng cho biết vấn đề triển khai (có điều gì đó khác với những gì được yêu cầu ở trên)?

+1

Bạn có thể hiển thị 'getSequence' không? Tôi đã cố gắng để repro mã của bạn và không nhận được một ngoại lệ. Đối với tôi nó hoạt động. Tất cả những gì tôi đã thay đổi là dòng gọi 'getSequence' thành cái này:' ISMILTimeContainer^container = ref new Sequence(); 'Có lẽ' getSequence' không trả về một 'Sequence'? –

+0

Không có thứ gì như kế thừa một lớp trong WinRT. Nó được thực hiện nội bộ bằng cách sử dụng bố cục. Tôi nghĩ trong trường hợp này, bạn có thể sử dụng safe_cast, điều này sẽ hoạt động "trên toàn" và không chỉ lên và xuống. Hãy suy nghĩ về nó như là một diễn viên pathfinding tôi đoán. –

Trả lời

3

container của bạn là một ISMILTimeContainer được tạo bởi implicit cast. Đây là upcasting, đúc một đối tượng lớp dẫn xuất (giá trị trả về của getSequence(), một Sequence) cho một đối tượng lớp cha hoặc lớp cơ sở (ISMILTimeContainer).

Khi bạn cố gắng chuyển xuống một câu lệnh tiếp theo, vì bạn có một chuỗi kế thừa, bạn vượt qua kiểm tra trình biên dịch bằng cách sử dụng static_cast<ISMILSequence^>.

Tuy nhiên, C++/CX cũng chạy kiểm tra thời gian chạy [1], và trong trường hợp này có vẻ như container biến của bạn, loại ISMILTimeContainer, không có tất cả các thông tin cần thiết để tạo thành một ISMILSequence trong bản Tuyên Bố thứ hai của bạn. Mặc dù ISMILSequence IS-A ISMILTimeContainer, điều ngược lại là không đúng sự thật.

Để biết thông tin về cách truyền và truyền xuống, hãy xem [2] hoặc các kết quả khác của google. Các phần sau trong bài đăng trên blog này có thể hữu ích.

Các vấn đề liên quan