2012-07-27 74 views
5

Khi tôi ghi đè các hàm trong D bằng các hợp đồng "trong", thì các hợp đồng "trong" được kế thừa được chọn. Nếu họ thất bại, thì các hợp đồng "in" bị ghi đè được kiểm tra. Nếu tôi không chỉ định bất kỳ hợp đồng nào, thì nó được hiểu là có hợp đồng "trong" trống. Vì vậy, mã sau đây biên dịch và chạy thành công.Làm thế nào tôi có thể sử dụng hợp lý các điều kiện tiên quyết trong các giao diện D?

module main; 
import std.stdio; 

interface I 
{ 
    void write(int i) 
    in 
    { 
     assert(i > 0); 
    } 
} 

class C : I 
{ 
    void write(int i) 
    { 
     writeln(i); 
    } 
} 

int main() 
{ 
    I i = new C; 

    i.write(-5); 
    getchar(); 

    return 0; 
} 

Tôi chỉ muốn các điều kiện tiên quyết của I.write() để được kiểm tra khi tôi gọi i.write() vì đó là những gì đang tĩnh biết đến là đủ cho I.write() để chạy một cách chính xác bởi trình biên dịch. Kiểm tra tất cả các điều kiện tiên quyết sau khi công văn động đánh tôi như là lẻ từ quan điểm OO kể từ khi đóng gói bị mất.

Tôi có thể lặp lại điều kiện tiên quyết hoặc viết in { assert(false); } trong tất cả các lớp triển khai giao diện, nhưng đó là một nỗi đau. Đó có phải là lỗi thiết kế trong ngôn ngữ D không? Hoặc có cách nào để mở rộng được không?

Trả lời

3

http://dlang.org/dbc.html

Nếu một hàm trong một lớp học có nguồn gốc đè một hàm trong lớp siêu của nó, sau đó chỉ là một trong những hợp đồng của hàm và chức năng cơ bản của nó phải được thỏa mãn. Chức năng ghi đè sau đó trở thành một quá trình nới lỏng các hợp đồng.

Một hàm không có trong hợp đồng có nghĩa là bất kỳ giá trị nào của tham số chức năng đều được cho phép. Điều này ngụ ý rằng nếu bất kỳ hàm nào trong một hệ thống phân cấp thừa kế không có trong hợp đồng, thì trong các hợp đồng về các hàm ghi đè nó không có tác dụng hữu ích.

Ngược lại, tất cả các hợp đồng cần phải được thỏa mãn, vì vậy chức năng ghi đè trở thành một quy trình thắt chặt hợp đồng.

Nó thực sự là một câu đố thiết kế khó khăn khi hành vi đa hình xuất hiện trong câu hỏi. Hãy xem, ví dụ: tại báo cáo lỗi này với thảo luận dài có liên quan: http://d.puremagic.com/issues/show_bug.cgi?id=6857

Về câu hỏi cách đạt được hành vi mong muốn - mixin luôn hoạt động khi cần sao chép-dán, nhưng tôi không chắc chắn nó từ quan điểm của thiết kế theo mô hình hợp đồng. Thật không may, cần ai đó về mặt lý thuyết hơn trong tư vấn câu hỏi này.

+0

Tôi không chắc liệu trang tài liệu đó không chỉ lỗi thời. Tôi phải xem xét TDPL để chắc chắn, nhưng có một lỗi tương tự như vấn đề của OP: http://d.puremagic.com/issues/show_bug.cgi?id=6549 – jpf

+0

@jpf Đó là một yêu cầu nâng cao. Một số người muốn ngôn ngữ thay đổi liên quan đến vấn đề này. Tài liệu là chính xác liên quan đến hành vi hiện tại. –

+0

Ồ đúng, tôi không nhận ra điều đó. – jpf

0

Điều kiện tiên quyết trong D là yêu cầu cho hàm chạy đúng. Nếu bạn quá tải hàm, bạn viết một mã mới cho nó, điều kiện tiên quyết cũ - đó là một yêu cầu cho mã cũ - không nhất thiết là một yêu cầu đối với mã mới.

0

Vì vậy, vấn đề này, tuy không trực tiếp thảo luận về giao diện, là http://d.puremagic.com/issues/show_bug.cgi?id=6856

Đây có thể là một trong những khó khăn để có được trong tuy nhiên, Walter là lớn trên không phá vỡ thay đổi điều.

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