Tôi thấy nhiều phương thức chỉ định giao diện làm giá trị trả lại. Suy nghĩ của tôi có đúng là điều đó có nghĩa là: phương pháp của tôi có thể trả về mọi loại lớp thừa kế từ giao diện đó? nếu không xin vui lòng cho tôi một câu trả lời tốt.Nếu một phương thức trả về một giao diện, nó có nghĩa là gì?
Trả lời
Có, phương pháp của bạn có thể trả về bất kỳ loại nào triển khai giao diện đó.
Dưới đây là một ví dụ:
using System;
class Foo
{
public IComparable GetComparable()
{
// Either of these return statements
// would be valid since both System.Int32
return 4;
// and System.String
return "4";
// implement System.IComparable
}
}
Tôi muốn thêm rằng nó gần như luôn luôn là một ý tưởng tồi để cố gắng để loại bỏ các loại thực tế và downcast. –
@Steven - Nó thường là một ý tưởng tồi có, nhưng có những trường hợp khi downcasting có thể rất có lợi. –
Ví dụ hay :) –
Vâng, phương pháp mà có thể trả về một đối tượng của bất kỳ loại mà thực hiện giao diện đó.
Nhưng, để sử dụng các thành viên không phải là giao diện của một loại cụ thể, bạn sẽ cần truyền cho loại đó.
Vâng, tôi đã cố gắng khắc phục điều đó ngay lập tức, nhưng ai đó cũng đang chỉnh sửa bài đăng của tôi. Có tất cả điều sai lầm. Nhưng tôi đã nhận được huy hiệu dọn dẹp. :) –
Phương thức có thể trả về loại lớp hoặc loại giá trị được đóng hộp. Nó không thể trả về một kiểu giá trị thực. Sự khác biệt đôi khi có thể là quan trọng, vì các loại giá trị đóng hộp hoạt động giống như các loại lớp.Trong một số trường hợp, một thường trình chấp nhận một 'U trong đó U: IEnumerable
Có, điều đó có nghĩa là điều duy nhất bạn biết về đối tượng được trả về là nó triển khai giao diện.
Trong thực tế, loại thực tế của đối tượng có thể thậm chí không truy cập được vào mã gọi. Nó có thể là một loại tư nhân trong một hội đồng riêng biệt.
Và trên thực tế, phương pháp này có thể trả về một kiểu khác từ một lời gọi đến lệnh tiếp theo (như trong trường hợp của một nhà máy trừu tượng).
Một câu trả lời cạnh tranh, nhưng tôi cảm thấy bắt buộc phải upvote! Các bit thông tin bổ sung của bạn sẽ rất hữu ích cho ai đó cố gắng hiểu điều này. –
@Patrick Karcher - Cảm ơn! :-) –
C++ hỗ trợ kỹ thuật lập trình được gọi là đa hình. Đó là một lớp dẫn xuất có thể trông giống như một lớp cơ sở cho mã khác mà không biết gì về các lớp dẫn xuất. Hãy nhìn vào tấm gương của ông:
class Shape
{
public:
virtual float Area() const = 0;
};
class Rectangle: public Shape
{
public:
Rectangle (float width, float height)
: m_width(width)
, m_height(height)
{}
virtual float Area() const
{
return m_width * m_height;
}
private:
float m_width;
float m_height;
};
class Circle: public Shape
{
public:
Circle (float radius)
: m_radius(radius)
{}
virtual float Area() const
{
return 3.141592653f*(m_radius*m_radius);
}
private:
float m_radius;
};
Bây giờ bạn có thể nhìn thấy từ mã này chúng tôi đã tạo một Shape lớp cơ sở (giao diện của chúng tôi) và hai lớp thừa chuyên lớp này, một trong một hình chữ nhật, một hình tròn. Bây giờ, hãy tạo một hàm in ra khu vực có hình dạng:
void PrintArea (const Shape& shape)
{
printf("Area of shape = %f",shape.Area());
}
Chức năng này không quan tâm nếu hình tròn của hình chữ nhật. Hoặc nó quan tâm là nó được thông qua một hình dạng và bạn có thể nhận được diện tích của nó, bất kể loại.
Vì vậy, mã này sử dụng chức năng này:
Rectangle r (5.0f,4.0f);
Circle c (25.0f);
PrintArea(r); // Print the area of the rectangle
PrintArea(c); // Print the area of the circle
Hope this helps.
Rất tiếc, tôi xin lỗi vì tôi đã viết điều này trong C++, không đọc câu hỏi đủ tốt để xem bạn có nghĩa là C#. Nhưng quá trình tương tự cũng được áp dụng. Hãy cho tôi biết nếu bạn muốn tôi viết lại mã mẫu ở trên trong C#. – Cthutu
cảm ơn Cthutu. Không có mẫu này rất rõ ràng. –
- 1. Phương pháp trả về một giao diện
- 2. Làm cách nào để xác định loại trả về của một phương thức giao diện là một giao diện khác?
- 3. Khi phương thức Perl trả về "hashref" nghĩa là gì?
- 4. Làm thế nào để thực hiện phương thức giao diện với kiểu trả về là một giao diện trong Golang
- 5. Khai báo một cấu trúc được trả về từ một phương thức giao diện
- 6. Trong GWT, tại sao một phương thức không trả về một giao diện?
- 7. Có thể có một phương thức giao diện được định nghĩa với kiểu trả về chung và việc triển khai cụ thể xác định kiểu trả về không?
- 8. "Giao diện công thức chuẩn cho một data.frame" có nghĩa là gì trong R?
- 9. Eclipse yêu nó, javac ghét nó, nó là một enum, loại, với một giao diện
- 10. Phương thức giao diện Java Phương pháp: Mỗi lớp có thực hiện một giao diện không?
- 11. Trả về có nghĩa là gì ở cuối phương thức void?
- 12. 'Giao diện người dùng phong phú' có nghĩa là gì?
- 13. Việc ném một ngoại lệ trong một phương thức có khiến phương thức trả về không?
- 14. StarUML định nghĩa các phương thức và thuộc tính giao diện trong biểu tượng giao diện?
- 15. Giao diện cho phương thức trả về kiểu riêng của mình
- 16. Bắt Intellisense trên giao diện mà một phương thức thực hiện nếu phương thức đó không có các chú thích XML riêng của nó
- 17. Định nghĩa các hằng số trong giao diện là gì?
- 18. phương thức java.util.Iterator.remove() có nghĩa là 'hoạt động tùy chọn' có nghĩa là gì?
- 19. một phương pháp trừu tượng là những gì trên một giao diện trong java
- 20. Trong C++, nếu ném là một biểu thức, loại của nó là gì?
- 21. Giao diện có phương thức toString không?
- 22. Tôi phải trả lại gì nếu kiểu trả về của phương thức là Void? (Không làm mất hiệu lực!)
- 23. Phương thức "this()" này có nghĩa là gì?
- 24. Chữ ký của phương thức trong Java có bao gồm kiểu trả về của nó không?
- 25. Trong Haskell, nó có nghĩa là gì nếu một liên kết "đổ bóng một ràng buộc hiện có"?
- 26. "Chương trình giao diện, không triển khai" nghĩa là gì?
- 27. "tạo phương thức" có nghĩa là gì trong C#?
- 28. Java: mở rộng một lớp và triển khai một giao diện có cùng phương thức
- 29. Phương thức Ruby có thể là một trình lặp hay trả về một mảng phụ thuộc vào ngữ cảnh không?
- 30. dict.get() phương thức trả về một con trỏ
@ddimitrov các câu hỏi cơ bản nhất được cho phép trên SO, có thể có một câu trả lời hợp lý khác, đó có thể là lý do tại sao anh ấy hỏi. bình luận của bạn không thêm gì cả. –
@ sam-holder, tôi đã sửa chữa. Đã xóa nhận xét ban đầu của tôi. – ddimitrov