Giới hạn dựa trên loại trả về được khai báo của phương pháp của bạn. Mã của bạn nói rằng:
f() {
in case one: return A;
in case two: return B;
in case three: return C;
}
Khi trong thực tế trình biên dịch đòi hỏi một cái gì đó như thế này:
FooType f() {
in case one: return A;
in case two: return B;
in case three: return C;
}
Nó phải có khả năng chuyển đổi A, B, và C đến một FooType, thường thông qua thừa kế đơn giản, mặc dù tôi sẽ không nhận được sự khác biệt giữa các lớp con so với phân loại phụ.
Có các phương pháp có thể giải quyết vấn đề này. Bạn có thể tạo một lớp hoặc cấu trúc (C++) có các trường cho mỗi kiểu trả về có thể khác nhau và sử dụng một số trường cờ để chỉ ra trường nào là giá trị trả về thực tế.
class ReturnHolder {
public int fieldFlag;
public TypeA A;
public TypeB B;
public TypeC C;
}
Ví dụ về enum trong câu trả lời khác giống nhau. Lý do tại sao đó là một hack là đoạn code để xử lý sự trở lại từ phương pháp này sẽ phải có rất nhiều mã để xử lý mỗi possibilites khác nhau, như vậy
main(){
FooType *x = new FooType();
ReturnHolder ret = x.f();
switch (ret.fieldFlag)
case: 1
//read ret.A
case: 2
//read ret.B
case: 3
//read ret.C
}
Và đó là thậm chí không cần đi sâu vào cố gắng làm điều đó với các ngoại lệ giới thiệu những vấn đề lớn hơn. Có lẽ tôi sẽ thêm điều đó vào sau này dưới dạng bản chỉnh sửa.
Nguồn
2010-02-10 15:32:22
Ví dụ không giống như ba loại khác nhau là một giải pháp tốt. Âm thanh giống như ba trường hợp khác nhau của một khu vực. Bạn có thể đưa ra một ví dụ hay một mô tả thực sự về những gì bạn đang cố gắng làm. –