2012-09-04 16 views
11

Không chắc nếu đây là một câu hỏi ngớ ngẩn, nhưng tôi chỉ nhận thấy điều này:Tại sao các tên tham số cần thiết trong định nghĩa giao diện? Tôi được phép chọn tên tham số mới trong quá trình thực

public interface IActivityDao : IDao<Activity> 
{ 
    IList<Activity> GetAllSinceSequence(long sequence, int count); 
} 

public class ActivityDao : AbstractNHibernateDao<Core.Domain.Activity>, IActivityDao 
{   
    public IList<Activity> GetAllSinceSequence(long sequence, int maxRecords) 
    { 

    } 
} 

Bên trong việc thực hiện của tôi, tôi đã gọi là tham số thứ hai của tôi 'maxRecords.' Tuy nhiên, trong giao diện, nó được định nghĩa là 'đếm'. Trình biên dịch vẫn xem xét giao diện được triển khai, điều này tốt, nhưng có thể dẫn đến một chút mơ hồ. Rõ ràng, tôi nên đổi tên một trong các tham số để khớp với các tham số khác.

Tôi đã chơi xung quanh một chút trước khi thực hiện đổi tên và nhận thấy điều gì đó thú vị. Tôi không được phép khai báo giao diện của mình là:

public interface IActivityDao : IDao<Activity> 
{ 
    IList<Activity> GetAllSinceSequence(long, int); 
} 

Đây có phải là trình biên dịch được bảo vệ quá mức chống lại C# symantics không? Mục đích của các tên tham số trong phương thức của giao diện khác với cách nào để làm cho mã dễ đọc hơn? Dường như với tôi rằng nó mời sự mơ hồ nếu các tên tham số không bị ép buộc khi triển khai.

Trả lời

19

Tên thông số được yêu cầu trong khai báo giao diện để rõ ràng việc triển khai và để tham khảo. Nếu ai đó đang sử dụng giao diện của bạn, tên của các tham số phương thức có nghĩa là tự tạo tài liệu để người tiêu dùng của giao diện hiểu những gì cần chuyển sang phương thức (ví dụ: khi xem mô tả phương pháp qua IntelliSense)

Và có, khi bạn thực hiện giao diện, bạn có thể đặt tên cho các tham số bất cứ điều gì bạn muốn.

+0

Bạn xứng đáng được thăng hạng nhiều hơn. Bạn có câu trả lời tốt nhất cho đến nay. Bạn đã trả lời câu hỏi của OP khá ngắn gọn. – Enigmativity

+2

Vâng, sắp xếp. Câu trả lời, trong khi rõ ràng, không thực sự giải quyết câu cuối cùng của bài viết của tôi. Tại sao không đảm bảo rằng các thông số sẽ được đặt tên giống nhau trong quá trình triển khai? Nếu ý định duy nhất là tự tài liệu và rõ ràng - tại sao không mang lại sự rõ ràng đó cho đến khi triển khai? Tôi không muốn vô tình quảng cáo phương pháp của mình khi chấp nhận 'đếm' khi tôi thực sự mong đợi 'maxResults'. –

+3

Vì bạn có thể muốn tự tài liệu cụ thể hơn ở cấp độ triển khai. Giả sử bạn đã tạo một giao diện IBinaryMathOperation, với một phương thức Execute (int operand1, int operand2). Sau đó, bạn đã triển khai một lớp AddOperation thực hiện giao diện. Các toán hạng "" cho một phương thức thêm được đặc biệt gọi là "bổ sung", và bạn có thể muốn gọi chúng là trong thực thi cụ thể của Execute(). – KeithS

2

Tôi sẽ tưởng tượng điều này là do các thông số có tên được đặt tên trong C#. Tức là, bạn cần phải có thể chỉ định thông số theo tên, không chỉ theo thứ tự mặc định:

IActivityDao dao; 
dao.GetAllSinceSequence(count: 1, sequence: 2); 

Tất nhiên, tên thông số sẽ khác nếu đối tượng được chọn làm đối tượng của bạn.

var concreteDao = (ActivityDao) dao; 
concreteDao.GetAllSinceSequence(maxRecords: 1, sequence: 2); 
+2

Ngoại trừ các giao diện tính năng sau ngày được thêm vào trong hầu hết một thập kỷ. –

+0

@KirkWoll ha ... điểm tốt. – McGarnagle

2

Hãy để tôi hỏi bạn điều này, có bất kỳ nơi nào khác trong khung .net cho phép bạn xác định chữ ký phương thức không có tên tham số không?

Vào cuối ngày tất cả mọi thứ đều có thể nhưng hầu hết mọi thứ đều có lý do, trong trường hợp này tôi sẽ tưởng tượng rằng đây là giới hạn của khuôn khổ và thiết kế trình biên dịch, và nó có thực sự quan trọng không?

Sau khi bạn định nghĩa hợp đồng để sử dụng, người ta sẽ mong đợi họ ở đó thực sự.

+0

+1 Để đề cập đến các hợp đồng –

1

Nhiều ngôn ngữ như hỗ trợ C# và VB named and option arguments to methods. Nếu không có tên đối số trong giao diện, việc sử dụng các đối số được đặt tên và tùy chọn sẽ không thể thực hiện được. Đặt tên các đối số cũng giúp người đọc hiểu được ý định và chức năng của giao diện.

8

Lịch sử. Điều này quay trở lại những ngày đầu của .NET, trở lại khi COM cai trị thế giới. Có thể interop với COM là rất quan trọng trở lại sau đó, không ai bao giờ ném đi tất cả mọi thứ để áp dụng một phong cách hoàn toàn mới của lập trình.

Điều này làm cho COM interop được hỗ trợ mạnh mẽ trong .NET nói chung. Cũng như sự cần thiết phải có các đối số được đặt tên cho các phương thức giao diện, hãy nhập các thư viện yêu cầu chúng.

Trường hợp góc thú vị là vĩnh viễn ngôn ngữ C++/CLI.Nó đã áp dụng nhiều quy tắc cú pháp C++, bao gồm khả năng bỏ qua các tên tham số trong các khai báo. Nói cách khác, đây là quy phạm pháp luật:

public interface class IFoo 
    { 
     void bar(int, long, double); 
    }; 

Các loại thư viện xuất khẩu tạo ra tuyên bố này:

HRESULT bar(
        [in] long p1, 
        [in] long p2, 
        [in] double p3); 

kết quả Rất tương tự nếu bạn thực hiện các giao diện trong một lớp C#, như autogenerated bởi IntelliSense:

class FooImpl : cpptemp36.IFoo { 
    public void foo(int __p1, int __p2, double __p3) { 
     throw new NotImplementedException(); 
    } 
} 

Điều này làm cho không ai hạnh phúc.

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