2009-04-23 41 views
18

Phương thức khởi tạo trong giao diện có xấu không?Phương thức khởi tạo trong giao diện

+4

Vì bạn không thể khởi tạo một giao diện làm thế nào bạn thậm chí sẽ sử dụng nó? –

+2

Tôi có nghĩa là xác định một hàm tạo trong một giao diện. –

+0

Đã xóa thẻ chủ quan. Dường như không có bất cứ điều gì chủ quan về câu hỏi này. – JaredPar

Trả lời

2

Dù chúng có tệ hay không, tôi không biết bất kỳ ngôn ngữ nào có khả năng chỉ định một hàm tạo trên giao diện. Tuy nhiên, cá nhân tôi không tin rằng hàm tạo của một đối tượng là một phần của giao diện của đối tượng đó và như vậy việc thêm một hàm tạo vào một giao diện sẽ ngăn cản tính linh hoạt tự nhiên mà giao diện có thể trả được.

+7

Đã muộn, nhưng PHP có khả năng này. (Điều này không làm cho nó trở thành một tính năng đáng giá, nhưng đó chỉ là ý kiến ​​của tôi.) – lotsoffreetime

12

Chúng tệ vì chúng không phục vụ mục đích gì. Ở cốt lõi của nó, một giao diện đơn giản là một hợp đồng chuyển dữ liệu. Không có implemenation gắn liền với một giao diện và do đó không có gì để khởi tạo và không cần cho một constructor.

Nếu bạn cần một số loại khởi tạo, tốt hơn bạn nên sử dụng lớp trừu tượng.

+6

Btw, tôi nghĩ, giao diện không chỉ là "hợp đồng chuyển dữ liệu đơn giản". Nó nên được coi là hợp đồng trách nhiệm mà lần lượt bao gồm đặc tả chữ ký. – isntn

+3

@isntn, ở cốt lõi của nó tất cả giao diện không chỉ định cách chuyển dữ liệu. Chỉ nghĩ rằng hành vi bảo đảm là hợp đồng và khuôn khổ kiểm tra. Giao diện có thể ngụ ý hành vi nhưng họ không thể đảm bảo nó – JaredPar

+0

Tôi đồng ý với JaredPar. Nếu bạn có hàm tạo trong giao diện của bạn, có vẻ như bạn cần một lớp trừu tượng. Bạn sẽ nhận được một số hành vi chung cho các thành phần thực hiện giao diện này, ít nhất là đối với các phương thức setter/getter liên quan đến các biến được truyền cho phương thức __construct, vì vậy bạn nên đi, IMO, tới một lớp trừu tượng trong ngữ cảnh này. –

4

Mặc dù các giao diện không thể có các hàm tạo trong hầu hết các ngôn ngữ, các Factory pattern cung cấp một hợp đồng để xây dựng các đối tượng, tương tự như một giao diện. Hãy nhìn vào đó.

36

Tại sao mọi người nghĩ rằng bất kỳ ai muốn khởi tạo giao diện?

Điều chúng tôi muốn làm là bắt buộc người triển khai thực hiện hàm tạo, giống như các phương thức giao diện khác.

Giao diện giống như một hợp đồng. Giả sử tôi có một hàng đợi giao diện, và tôi muốn đảm bảo rằng những người triển khai tạo ra một hàm tạo với một đối số, tạo ra một hàng đợi đơn (Một hàng đợi mới chỉ với phần tử đó). Tại sao điều đó không phải là một phần của hợp đồng? Với ít nhất các giao diện Java, không thể chỉ định giao diện đó.

+12

+1 Vì vậy, không, chúng không tệ. “Tại sao mọi người nghĩ rằng ai đó muốn khởi tạo giao diện?” Đồng ý, IMO OP không hỏi điều đó. Nếu một lớp đòi hỏi một giá trị mỗi khi nó được khởi tạo (ví dụ, một lớp trình bao bọc) có vẻ như với tôi rằng một hợp đồng chuyển dữ liệu có thể hữu ích. Đặc biệt trong PHP, nơi các phương thức không thể bị ghi đè - hàm tạo được "khóa" trong một hành vi nhất định. – Ben

+4

Phương thức có thể được ghi đè trong PHP nhưng không bị quá tải. –

+2

Có lẽ @Steve đã đề cập đến nghĩa vụ khớp với chữ ký của nhà xây dựng. – XedinUnknown

5

Trước hết, tôi không đồng ý rằng giao diện chỉ là hợp đồng chuyển dữ liệu. Nếu điều đó đúng, bạn sẽ được phép định nghĩa các thuộc tính trong một giao diện.

tôi sẽ không chính xác nghĩ rằng nó là lạ để làm điều gì đó như:

interface IDBConnection 
{ 
    function __construct($connectionString); 
    function executeNonQuery($commandText, $paramters=null); 
    function executeScalar($commandText, $paramters=null); 
    function executeSingle($commandText, $paramters=null); 
    function executeArray($commandText, $paramters=null); 
} 

Điều này sẽ cho phép bạn tạo ra các trường hợp của các lớp học của bên thứ ba để truy cập dữ liệu dựa trên phản ánh đơn giản thay vì chỉ là một hợp đồng dữ liệu.

Tôi khá chắc chắn rằng đây không phải là ví dụ tốt nhất, tôi muốn tìm một lớp cơ sở trừu tượng ở đây trong thế giới thực, nhưng tôi cũng khá chắc chắn rằng có lý do chính đáng để xác định một hàm tạo hợp đồng của các phương thức trong một giao diện mà tôi chưa từng nghĩ tới.

Tôi chưa từng thấy nó, nhưng tôi không nghĩ nó là lạ hay xấu.

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