2010-03-04 31 views
6

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ì?

+7

@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ả. –

+0

@ sam-holder, tôi đã sửa chữa. Đã xóa nhận xét ban đầu của tôi. – ddimitrov

Trả lời

11

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 
    } 
} 
+2

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. –

+2

@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. –

+2

Ví dụ hay :) –

4

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 đó.

+0

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. :) –

+0

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ó thể hoạt động rất khác nhau khi chuyển một 'IEnumerable ' so với khi nó được chuyển thành một cấu trúc như 'List .Enumerator'. – supercat

5

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).

+0

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. –

+0

@Patrick Karcher - Cảm ơn! :-) –

3

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.

+1

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

+0

cảm ơn Cthutu. Không có mẫu này rất rõ ràng. –

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