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?
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
@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. –
Ồ đúng, tôi không nhận ra điều đó. – jpf